#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).
Ожидайте дальнейших откровений от других экспертов 🙂