Py_INCREF в Cython принимает объект Python, но не указательPython

Программы на Python
Anonymous
Py_INCREF в Cython принимает объект Python, но не указатель

Сообщение Anonymous »

У меня есть небольшая реализация связанного списка в Cython, и я хочу добавить в него значение.
По какой-то причине, когда я пытаюсь использовать 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
Предположительно, Py_INCREF предназначен для работы с PyObject*.
Как поиск в Интернете, так и прямой чатgpt предложил следующее:

Код: Выделить всё

Py_INCREF
в Cython работает с PyObject*, который является указателем
объекта Python, а не объекта уровня Python. Поэтому вам следует передать
PyObject* (указатель) на Py_INCREF.

Код выглядит так просто, я не знаю, почему это не работает.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ot-pointer

Вернуться в «Python»