#cython #header-files
#cython #заголовочные файлы
Вопрос:
Я пытаюсь «cythonize» следующий пример кода, который включает экземпляр класса Enum:
from enum import Enum
class AnimalType(Enum):
Shark = 0
Fish = 1
class Animal:
def __init__(self, animal_type: AnimalType, weight: float):
self.animal_type = animal_type
self.weight = weight
Создать .pyx-файл с объявлениями типов легко:
cpdef enum AnimalType:
Shark = 0
Fish = 1
cdef class Animal:
cdef double weight
cdef AnimalType animal_type
def __init__(self, animal_type: AnimalType, weight: float):
self.animal_type = animal_type
self.weight = weight
Однако я не могу разделить файл .pyx на .pyx и .pxd (заголовочный) файл. Не могли бы вы помочь мне определить .pxd-файл для моего примера?
Редактировать: я прочитал https://groups.google.com/g/cython-users/c/ZoLsLHwnUY4 . Возможно, это невозможно сделать….
Ответ №1:
Это работает для меня, не делая ничего особенного:
testenum.pxd:
cpdef enum AnimalType:
Shark = 0
Fish = 1
(Вы также можете поместить cdef
Animal
туда части, если хотите поделиться определением Cython для этого).
testenum.pyx:
# no need to cimport testenum - this happens implicitly
cdef class Animal:
cdef double weight # omit this if you put it in the pxd file
cdef AnimalType animal_type # omit this if you put it in the pxd file
def __init__(self, animal_type: AnimalType, weight: float):
self.animal_type = animal_type
self.weight = weight
someotherfile.pyx:
from testenum cimport AnimalType
cdef class C:
cdef AnimalType at
Комментарии:
1. из testenum import AnimalType также работает.
2. Я думал, что вы можете определять типы и объявления типов только в pxd-файле. Не ожидал, что смогу настроить перечисление, а затем импортировать / импортировать куда угодно. Но это работает так…
3. Разница между
import
иcimport
заключается в том, что сcimport
Cython знает о типе при компиляции. Что иногда бывает полезно