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

标签 python python-c-api

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

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

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

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

但我没有看到一种方法可以将其组合起来,例如,包含一个适当的整数和一个 None 值的元组。

最佳答案

在 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()不会为你做。

关于python - 如何从 C API 返回包含 None 值的元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16400600/

相关文章:

python - 使用 np.tile 生成 (n, 1, 2) 数组

python - 如何为目录中的每个项目创建一个文件夹?

python - 无法正确获取 Twitter 抓取中的 min_position

python - numpy 数组 C api

python - 使用 For 循环编辑列表中的后续值

python - 如何有效地检查一个字符串是否至少包含两个列表中的一个元素

python - Python C 扩展中的内存泄漏

python - 为什么这个 'from-import' 因 PyRun_SimpleString 而失败?

python - 将 Python 字典转换为类 C 结构

python - 将 Python 长整数转换为 C 字符数组