2013-05-06 68 views
3

什么是适当的方式返回包含从C扩展到Python一None值的元组?我知道,一个None值可以使用如何返回一个包含从C API None值的元组?

result = Py_BuildValue(""); 

和一个元组可以使用类似

result = Py_BuildValue("(ii)", 123, 456); 

被创建,但我不明白的方式结合本获得,例如创建,一个包含适当整数和None值的元组。

回答

4

这里只有一个永远在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()不会为你做。

+0

是使用'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

+0

@ReinierTorenbeek对不起。我重新检查了文档,并意外地阅读了错误的章节,更新了答案,然后意识到了错误,并恢复了答案。 – Aya 2013-05-06 14:57:34

+0

@ReinierTorenbeek再次更新了答案。 FWIW,后一种方法稍微快一点,因为它不必分析格式字符串。为广泛的答案 – Aya 2013-05-06 15:11:24

3
result = Py_BuildValue("(isi)", 123, NULL, 456); 

参考:http://docs.python.org/2/c-api/arg.html#Py_BuildValue

+2

...或'Py_BuildValue( “(IOI)”,123,Py_None,456)' – Aya 2013-05-06 14:29:29

+0

谢谢,这工作正常。抱歉不接受你的回答,我的行为太快了。我接受了绫的回答,因为它似乎更合适。使用'NULL'字符串感觉有点像对我来说是一个黑客。 – 2013-05-06 14:43:58