4

None将包含来自 C 扩展的值的元组返回到 Python 的适当方法是什么?None我知道可以使用创建单个值

result = Py_BuildValue("");

并且可以使用类似的东西创建一个元组

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

但是我看不到一种方法可以将其组合起来以获取例如包含正确整数和None值的元组。

4

2 回答 2

5

Python 中只有一个None对象,你可以在 C 中将它称为Py_None.

编码...

result = Py_BuildValue("");

...只是增加 refcountPy_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()它不适合你。

于 2013-05-06T14:39:57.153 回答
3
result = Py_BuildValue("(isi)", 123, NULL, 456);

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

于 2013-05-06T14:15:11.927 回答