Я пытаюсь построить мое расширение phisrt python, используя Cython.
Мои C файлы разделены логически, и функциональность "вложенная" - в этом модуле C зависит от функций, определенных в модуле B, которые затем зависят от модуля A.
Мне трудно понять, как разделить мои файлы.pxd и.pyx, чтобы я мог поддерживать зависимость между функциональными модулями.
Следующий фрагмент, надеюсь, должен помочь прояснить ситуацию:
Примечание. Файл FooBar.h содержит файл CommonDefs.h, который объявляет общие типы данных и предоставляет простой API для этих общих типов (myArray и mySet).
Я уже создал файлы ccommontypes.pxd и commontypes.pyx, которые экспортируют типы и функции данных, объявленные/определенные в CommonDefs.h и CommonDefs.c. Мне удалось успешно скомпилировать модуль расширения python.
Теперь я хочу перейти к следующему этапу, который предназначен для экспорта типов и функций данных, которые зависят от CommonDefs.h. Однако я обнаружил, что мне приходится переопределять типы myArray и mySet (хотя они уже были объявлены в ccommontypes.pxd
Кажется, я никак не могу найти импорт или включение этих объявлений, поэтому мне нужно повторно объявить их в файле ниже, поскольку функции принимают аргументы типа myArray и mySet.
Вопрос 1 Можно ли повторно использовать типы снова, как я сделал ниже, или есть какие-либо проблемы, о которых я должен знать?
//cfoobar.pxd
cdef extern from "../include/FooBar.h":
cdef struct FooBar:
pass
ctypedef struct myArray: // already declared elsewhere
pass
ctypedef struct mySet: // Already declared elsewher
pass
struct FooBar * foobar_new(mySet *s1)
//foobar.pyx
cimport cfoobar
cdef class FooBar:
cdef cfoobar.FooBar *_foobar
def __cinit__(self, myset):
_foobar = cfoobar.foobar_new(myset);
if (ret == 0):
raise MemoryError()
Вопрос 2 В приведенном выше коде FooBar ctor функция выделения памяти ожидает указатель на переменную mySet. Однако, когда я пытаюсь скомпилировать этот код, я получаю эту ошибку:
Невозможно преобразовать объект Python в 'mySet *'
Я понимаю сообщение об ошибке, но поскольку Python не статически типизирован, я не знаю, как я могу указать тип данных.
Я был бы признателен за помощь в решении этого вопроса.
Я столкнулся с этим вопросом, пытаясь разобраться в проблемах с редизайном в самих pxds. Я считаю, что должно быть какое-то "gotchas", но я не рискну еще сказать, что это такое. :)
Но на вопрос 2: python динамически типизирован, но cython не... просто переменные без типов статически типизируются как объекты python.
Ты можешь измениться:
def __cinit__(self, myset):
чтобы:
def __cinit__(self, mySet *myset):
если вы действительно передаете указатель на myset...