Cython: Как я могу создать .pxd-файл для кода, включающего перечисление?

#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 знает о типе при компиляции. Что иногда бывает полезно