我正在使用Cython为Python编写一个C库的高级接口。
我有一个扩展类型A,用于使用指向更复杂的C上下文结构c_context的指针初始化库。指针保存在A中。
A还具有一个def函数,它又创建了另一个扩展类型B,通过调用库函数来初始化另一个C结构。该结构需要用于B中后续的库调用。
B需要来自A的c_context指针,我将其包装到扩展类型py_context中以便将其传递给B的__cinit__函数。
将包装器传递给正确的C上下文可以完美地工作。
现在,我需要再次从`py_context`中获取C结构体并将其保存在`B`中。我在`py_context.pxd/pyx`中添加了`cdef c_context get(self)`。从`Bs __cinit__`调用`py_context.get()`会导致:`AttributeError: py_context object has no attribute get.`
看来我无法理解何时调用Cython中的`cdef`函数。
因此,我的问题是:从封装类中提取C结构体的最佳方法是什么?
#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上下文可以完美地工作。
现在,我需要再次从`py_context`中获取C结构体并将其保存在`B`中。我在`py_context.pxd/pyx`中添加了`cdef c_context get(self)`。从`Bs __cinit__`调用`py_context.get()`会导致:`AttributeError: py_context object has no attribute get.`
看来我无法理解何时调用Cython中的`cdef`函数。
因此,我的问题是:从封装类中提取C结构体的最佳方法是什么?