По какой-то причине, когда я пытаюсь использовать Py_INCREF (чтобы убедиться, что я сохраняю надежную ссылку в каждом узле), Cython не принимает указатель на объект Python, а только сам объект:
Код: Выделить всё
ctypedef struct Node:
PyObject* group
PyObject* value # (group, value)
Node* next
cdef bint _put(object group, object value) except 1:
cdef:
Node* node = PyMem_Malloc(sizeof(Node))
PyObject* _group =
group
PyObject* _value = value
if not node:
raise MemoryError("Failed to allocate memory for new node")
node.group = _group
Py_INCREF(node.group) # Cannot convert 'PyObject *' to Python object
Py_INCREF(_group) # Cannot convert 'PyObject *' to Python object
Py_INCREF( group) # Cannot convert 'PyObject *' to Python object
Py_INCREF(group) # Works
Как поиск в Интернете, так и прямой чатgpt предложил следующее:
Код: Выделить всё
Py_INCREFобъекта Python, а не объекта уровня Python. Поэтому вам следует передать
PyObject* (указатель) на Py_INCREF.
Код выглядит так просто, я не знаю, почему это не работает.
Подробнее здесь: https://stackoverflow.com/questions/790 ... ot-pointer