将结构*从一个 Cython class 传递到另一个
Passing a struct* from one Cython class to another
我正在尝试将结构指针从一个 Cython class 传递到另一个。这是一些示例代码:
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)
当我尝试编译此 class 时,我在 my_struct = self.m.get_my_struct()
行周围遇到了这两个错误:
Cannot convert Python object to 'MyStruct *
和
Storing unsafe C derivative of temporary Python reference
为什么 Cython 试图在这里进行转换?它不能直接传递指针吗?
在 PrinterClass
中,将 cdef object m
替换为 cdef MyClass m
或明确地将 self.m
转换为 MyClass
:my_struct = (<MyClass>self.m).get_my_struct()
。 (另外,MyClass
还要加一个__dealloc__
)。
我猜区别在于object
是一个python对象(本质上是dict
),而cdef class
是另一种class(本质上,struct
),见Extension types (aka. cdef classes)。
期待其他专家的进一步启示:)
我正在尝试将结构指针从一个 Cython class 传递到另一个。这是一些示例代码:
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)
当我尝试编译此 class 时,我在 my_struct = self.m.get_my_struct()
行周围遇到了这两个错误:
Cannot convert Python object to 'MyStruct *
和
Storing unsafe C derivative of temporary Python reference
为什么 Cython 试图在这里进行转换?它不能直接传递指针吗?
在 PrinterClass
中,将 cdef object m
替换为 cdef MyClass m
或明确地将 self.m
转换为 MyClass
:my_struct = (<MyClass>self.m).get_my_struct()
。 (另外,MyClass
还要加一个__dealloc__
)。
我猜区别在于object
是一个python对象(本质上是dict
),而cdef class
是另一种class(本质上,struct
),见Extension types (aka. cdef classes)。
期待其他专家的进一步启示:)