Я пытаюсь построить свое первое расширение 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 не является статически типизированным, я не получаюНе знаю, как я могу указать тип данных.
Буду признателен за помощь в решении этой проблемы.