什么是适当的方式返回包含从C扩展到Python一None
值的元组?我知道,一个None
值可以使用如何返回一个包含从C API None值的元组?
result = Py_BuildValue("");
和一个元组可以使用类似
result = Py_BuildValue("(ii)", 123, 456);
被创建,但我不明白的方式结合本获得,例如创建,一个包含适当整数和None
值的元组。
什么是适当的方式返回包含从C扩展到Python一None
值的元组?我知道,一个None
值可以使用如何返回一个包含从C API None值的元组?
result = Py_BuildValue("");
和一个元组可以使用类似
result = Py_BuildValue("(ii)", 123, 456);
被创建,但我不明白的方式结合本获得,例如创建,一个包含适当整数和None
值的元组。
这里只有一个永远在None
Python对象,你可以随时引用它在C作为Py_None
。
代码...
result = Py_BuildValue("");
...只是递增的Py_None
引用计数,并返回它的指针,所以它的同...
Py_INCREF(Py_None);
result = Py_None;
如果你只是想返回None
,然后用...
Py_INCREF(Py_None);
return Py_None;
...或者,从Python 2.4开始,你可以做同样的事情NG了宏...
Py_RETURN_NONE;
如果你在一个元组返回,就像这样......
return Py_BuildValue("(O)", Py_None);
...有没有必要增加引用计数 - Py_BuildValue()
会替你。
但是,如果你在这样一个元组返回它...
PyObject* tuple = PyTuple_New(1);
Py_INCREF(Py_None);
PyTuple_SetItem(tuple, 0, Py_None);
return tuple;
...那么你必须增加引用计数,因为PyTuple_SetItem()
不会为你做。
result = Py_BuildValue("(isi)", 123, NULL, 456);
...或'Py_BuildValue( “(IOI)”,123,Py_None,456)' – Aya 2013-05-06 14:29:29
谢谢,这工作正常。抱歉不接受你的回答,我的行为太快了。我接受了绫的回答,因为它似乎更合适。使用'NULL'字符串感觉有点像对我来说是一个黑客。 – 2013-05-06 14:43:58
是使用'Py_BuildValue( “(O)”,Py_None)'时,需要明确的引用计数增量? [O'的'Py_BuildValue()'](http://docs.python.org/2/c-api/arg.html#Py_BuildValue)的文档状态:*传递一个Python对象(触发器除外)算,其加一)* – 2013-05-06 14:56:12
@ReinierTorenbeek对不起。我重新检查了文档,并意外地阅读了错误的章节,更新了答案,然后意识到了错误,并恢复了答案。 – Aya 2013-05-06 14:57:34
@ReinierTorenbeek再次更新了答案。 FWIW,后一种方法稍微快一点,因为它不必分析格式字符串。为广泛的答案 – Aya 2013-05-06 15:11:24