将结构*从一个 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 转换为 MyClassmy_struct = (<MyClass>self.m).get_my_struct()。 (另外,MyClass还要加一个__dealloc__)。

我猜区别在于object是一个python对象(本质上是dict),而cdef class是另一种class(本质上,struct),见Extension types (aka. cdef classes)

期待其他专家的进一步启示:)