Я пытаюсь «китонизировать» следующий пример кода, который включает экземпляр класса 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. Может и не получится....
Это работает для меня, не делая ничего особенного:
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
какой-то другой файл.pyx:
from testenum cimport AnimalType
cdef class C:
cdef AnimalType at
Я думал, что вы можете определять типы и объявления типов только в pxd-файле. Не ожидал, что смогу настроить перечисление, а затем импортировать/импортировать куда угодно. Но работает так...
Разница между import
и cimport
в том, что с cimport
Cython знает о типе во время компиляции. Что иногда полезно
from testenum import AnimalType тоже работает.