我正在尝试将结构指针从一个Cython类传递给另一个。这是一些示例代码:
cdef struct MyStruct:
int a
int b
cdef class MyClass:
cdef MyStruct* s
def __init__(self):
self.s = <MyStruct*> malloc(sizeof(MyStruct))
self.s.a = 1
self.s.b = 2
cdef MyStruct* get_my_struct(self):
return self.s
cdef class PrinterClass:
cdef object m
def __init__(self):
self.m = MyClass()
cpdef print_struct(self):
cdef MyStruct* my_struct
my_struct = self.m.get_my_struct()
print(my_struct.a)
当我尝试编译此类时,我在my_struct = self.m.get_my_struct()
行周围遇到了这两个错误:
无法将Python对象转换为'MyStruct *
和
存储临时Python参考的不安全C派生
为什么Cython在这里尝试进行转换?它不能按原样传递指针吗?
答案 0 :(得分:1)
在PrinterClass
中,将cdef object m
替换为cdef MyClass m
或将self.m
强制转换为MyClass
:my_struct = (<MyClass>self.m).get_my_struct()
。 (此外,应将__dealloc__
添加到MyClass
中)。
我想区别在于object
是一个python对象(本质上是dict
),而cdef class
是另一种类(本质上是struct
),请参见Extension types (aka. cdef classes)。
期待其他专家的进一步启示:)