Передача структуры * из одного класса Cython в другой

#python #cython

#python #cython

Вопрос:

Я пытаюсь передать указатель на структуру из одного класса 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)
  

Когда я пытаюсь скомпилировать этот класс, я получаю эти 2 ошибки в my_struct = self.m.get_my_struct() строке:

Не удается преобразовать объект Python в ‘MyStruct *

и

Хранение небезопасной производной C от временной ссылки на Python

Почему Cython пытается выполнить преобразования здесь? Разве он не может просто передать указатель как есть?

Ответ №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 ), см. Типы расширений (он же классы cdef).

Ожидайте дальнейших откровений от других экспертов 🙂