Я пишу интерфейс высокого уровня для библиотеки 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-структуры из класса оболочки?