Я пишу интерфейс высокого уровня для библиотеки C для Python с помощью Cython.
У меня есть расширение Type A
, которое инициализирует библиотеку указателем на более сложную структуру контекста C c_context
. Указатель сохраняется в A
. A
также имеет функцию def
, которая, в свою очередь, создает другое расширение. Тип B
инициализирует другую структуру C с вызовом функции библиотеки. Эта структура необходима для последующих вызовов библиотеки, сделанных в B
. B
требуется указатель c_context
из A
, который завернут мной в тип расширения py_context
, чтобы передать его в __cinit__
из B
:
#lib.pxd (C library definitions)
cdef extern from "lib.h":
ctypedef struct c_context:
pass
#file py_context.pxd
from lib cimport c_context
cdef class py_context:
cdef c_context *context
cdef create(cls, c_context *context)
cdef c_context* get(self)
#file py_context.pyx
def class py_context:
@staticmethod
cdef create(cls, c_context *c):
cls = py_nfc_context()
cls.context = c
return cls
cdef c_context* get(self):
return self.context
Передача обертки с правильным контекстом C работает отлично.
Теперь мне нужно снова вернуть C struct из py_context
и сохранить его в B
. Я добавил cdef c_context get(self)
в py_context.pxd/pyx
.
Вызов py_context.get()
из Bs __cinit__
приводит к: AttributeError: py_context object has no attribute get.
Кажется, что я не обнимаюсь, когда называть функции cdef
в Cython.
Итак, мой вопрос:. Каков наилучший способ извлечения C-структуры из класса оболочки?