例如,有一些 Python C-API 函数会窃取一个传递参数的引用PyList_SetItem https://docs.python.org/c-api/list.html#c.PyList_SetItem,而另一些则增加参数的引用计数,例如PyList_Append https://docs.python.org/c-api/list.html#c.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)