gpt4 book ai didi

python - 将对象从 C 返回给 Python

转载 作者:太空狗 更新时间:2023-10-29 21:06:13 26 4
gpt4 key购买 nike

我已经阅读了 Python C-API 的文档,甚至编写了一些扩展模块。但是,当涉及到从 C 函数返回 Python 对象时,我仍然不太清楚确切的语义。

Python 文档中的有限示例通常显示一个返回 Py_BuildValue 结果的 C 函数。现在,Py_BuildValue 返回一个 New Reference,并将此引用的所有权转移给解释器。那么,我是否可以由此推断,返回给 Python 的任何对象都必须是一个新引用,这是一条通用规则,并且从 C 函数返回一个对象与转移该对象的所有权是一样的交给口译员?

如果是这样,如果您返回一个已被某物拥有的对象,情况会怎样?例如,假设您编写了一个 C 函数,它接受一个 PyObject*,它是一个 tuple,然后您在其上调用 PyTuple_GetItem 并返回结果。 PyTuple_GetItem 返回一个借来的引用 - 这意味着该项目仍然由元组“拥有”。那么,返回类似 PyTuple_GetItem 的结果的 C 函数是否必须在将结果返回给解释器之前INCREF

例如:

static PyObject* my_extension_module(PyObject* tup)
{
PyObject* item = PyTuple_GetItem(tup, 1);
if (!item) { /* handle error */ }

return item; // <--- DO WE NEED TO INCREF BEFORE RETURNING HERE?
}

最佳答案

Python 期望您向它公开的任何函数返回一个 引用,是的。如果你只有一个借用的引用,你必须调用 Py_INCREF 来提供一个新的引用。如果您返回借用的引用,Python 将继续调用 Py_DECREF(当引用完成时),最终这将导致对象在仍在使用时被释放。

(在解释器退出期间发生“最终”释放的情况并不少见,在这种情况下,它可能不会被注意到,但返回借用的引用仍然是错误的。)

关于python - 将对象从 C 返回给 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6176668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com