使Cython枚举可见

时间:2019-03-26 10:12:47

标签: enums cython

这个问题本质上是关于this question的跟进。具体来说,我想知道跨共享模块的枚举可见性。 本质上,我想将包装好的C枚举作为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.pyxcimport

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'

简而言之:pxd文件中声明的枚举不包含在最终模块中,即使它声明为cpdef

此行为是故意的吗?有什么办法可以将声明包含在生成的模块中?

0 个答案:

没有答案