【发布时间】:2017-01-29 20:18:17
【问题描述】:
有一些 Python C-API 函数会窃取一个传递参数的引用,例如 PyList_SetItem,而其他一些函数会增加参数的引用计数,例如 PyList_Append。
我可以告诉 Cython 引用将被盗吗?还是我需要手动使用Py_INCREF?
from cpython.object cimport PyObject
from cpython.ref cimport Py_INCREF
cdef extern from "Python.h":
void PyList_SetItem(object list, Py_ssize_t i, object o)
cpdef void func(list lst, object item):
Py_INCREF(item)
PyList_SetItem(lst, 0, item)
我知道如果一个函数返回一个借用的引用,则可以更改返回类型(PyObject * 用于借用的引用,object 用于未借用的引用):
from cpython.object cimport PyObject
from cpython.ref cimport Py_INCREF
cdef extern from "Python.h":
PyObject* PyList_GetItem(object list, Py_ssize_t index)
object PyObject_GetItem(object o, object key)
但这似乎不适用于被盗的参考文献(或者我的想法是错误的?):
from cpython.object cimport PyObject
cdef extern from "Python.h":
void PyList_SetItem(object list, Py_ssize_t i, PyObject *o)
cpdef void func(list lst, object item):
PyList_SetItem(lst, 0, <PyObject*>item)
【问题讨论】:
-
这是一个很好的问题。我也有兴趣了解如何解决这个问题。已经提出 [GH-2722](github.com/cython/cython/issues/2722) 来解决这个问题。
标签: python cython python-c-api