Python 函数窃取引用时Cython函数声明

Python 函数窃取引用时Cython函数声明,python,cython,python-c-api,Python,Cython,Python C Api,例如,有些Python C-API函数会窃取一个已传递参数的引用,而其他函数会增加该参数的引用计数 我能告诉Cython参考资料会被偷吗?或者我需要手动使用Py\u 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

例如,有些Python C-API函数会窃取一个已传递参数的引用,而其他函数会增加该参数的引用计数

我能告诉Cython参考资料会被偷吗?或者我需要手动使用
Py\u 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
对于非借用的引用):

但这似乎不适用于被盗的参考资料(或者我的想法是错误的?)

来自cpython.object cimport PyObject
“Python.h”中的cdef外部:
无效PyList_SetItem(对象列表,Py_ssize_t i,PyObject*o)
cpdef void func(列表lst,对象项):
PyList_设置项(lst,0,项)

这是一个很好的问题。我也有兴趣了解如何解决这个问题。已经提出[GH-2722]()来解决这个问题。
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)