如何从C API返回包含None值的元组?

时间:2013-05-06 14:11:29

标签: python python-c-api

将包含None值的元组从C扩展名返回到Python的适当方法是什么?我知道可以使用

创建一个None
result = Py_BuildValue("");

并且可以使用类似

之类的东西创建元组
result = Py_BuildValue("(ii)", 123, 456);

但我没有看到一种方法来组合它,例如,获取包含正确整数和None值的元组。

2 个答案:

答案 0 :(得分:4)

Python中只有一个None对象,您可以随时在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开始,你可以用宏做同样的事情......

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()不适合你。

答案 1 :(得分:3)

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

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