如何在Cython中包装一个匿名枚举并给它一个名字?

时间:2017-03-22 19:10:32

标签: python enums cython

我正在使用Cython包装一些C ++代码,并且在嵌套在两个名称空间中的匿名枚举存在一些问题。

来自some_header.hpp的示例定义:

namespace A {
    namespace B {
        enum {
            X = 0,
            Y = 1,
            Z = 2
        };
    }
}

上述头文件的.pxd文件:

cdef extern from 'some_header.hpp' namespace 'A::B':
    cdef enum:
        CX 'A::B::X'    \
        CY 'A::B::Y'     > Can this be simplified somehow?
        CZ 'A::B::Z'    /

我的.pyx包装模块:

class B(IntEnum):
    X = CX    \
    Y = CY     > CX, CY and CZ are global in my .pyx module
    Z = CZ    /

我可以在我的CX文件中使用CYCZ.pyx,如上所示,但如果我可以执行类似{{1 },CB.XCB.Y,即。 CB.Z在我的模块中不会是全局的。

CX/CY/CZ中的扩展名称空间'A::B::X'也可以简化或删除吗?

2 个答案:

答案 0 :(得分:1)

我自己还没有尝试过Cython的C ++支持,但是你试过简单地给它一个名字,很确定Cython并不关心引用的枚举是否是匿名的。无论如何,这些枚举值仍将在全局范围内。

您也可以尝试使用Cython' cpdef来定义这些枚举并保存一些输入,可能是这样的:

cdef extern from 'some_header.hpp' namespace 'A::B':
    cpdef enum B:
        X
        Y
        Z

然后,这只是对C级Cython的支持,所以我不确定这是否适用于C ++代码。

答案 1 :(得分:1)

一种方法是使用一个非常小的pxd文件,在其名称空间中仅声明此枚举。这样,enum在其余的Cython代码中都有一个简单的命名空间。我能够在OS X上编译/工作:

接口.pxd文件:

# a.pxd
cdef extern from "some_header.cpp" namespace "A::B":
    cdef enum:
        X
        Y
        Z

和演示代码

cimport a

cpdef foobar():
    return a.X, a.Y, a.Z # enum values are namespaced inside `a`