Этот вопрос по существу является продолжением этого вопроса . В частности, мне интересно узнать о перечислении между общими модулями.
По сути, я хотел бы сделать оболочку 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
.
Является ли это поведение преднамеренным? Есть ли способ включить объявление в сгенерированный модуль?