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

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

result = Py_BuildValue("");

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

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

但我没有看到一种方法来组合它,例如,一个元组包含一个正确的整数和一个无值.

最佳答案 在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()不会为你做.

点赞