Создание перечислений Cython видимыми - PullRequest
3 голосов
/ 26 марта 2019

Этот вопрос по существу является продолжением этого вопроса . В частности, мне интересно узнать о перечислении между общими модулями. По сути, я хотел бы сделать оболочку C enum частью Python API (используя cython). Самый простой способ обернуть некоторый существующий код C будет простым lib.pyx (для простоты я дословно включил заголовок)

cdef extern from *:
"""
typedef enum Status {GOOD, BAD} Status;
"""
cpdef enum Status:
    GOOD,
    BAD

Если я скомпилирую этот файл в разделяемую библиотеку (скажем, lib.so), я могу напрямую использовать перечисление, то есть я могу набрать python3 -c "import lib; print(lib.Status)" и увидеть <enum 'Status'>, что действительно является ожидаемым поведением.

Теперь предположим, что я хотел бы разбить код на заголовок (он же lib.pxd) содержащий код сверху, а также файл реализации (он же lib.pyx) cimport с заголовком:

from lib cimport Status

def test():
    print Status.GOOD

Я могу снова скомпилировать проект, однако результаты совсем другие. Я могу получить доступ к функции test, но python3 -c "import lib; lib.test()" просто возвращает 0, а не <Status.GOOD: 0>.

Более того, python3 -c "import lib; print(lib.Status)" теперь дает мне

Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: module 'lib' has no attribute 'Status'

Вкратце: enum, объявленный в файле pxd, не включен в последний модуль, даже если он объявлен как cpdef.

Является ли это поведение преднамеренным? Есть ли способ включить объявление в сгенерированный модуль?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...