python - 如何在 Cython 中包装匿名枚举并为其命名?

标签 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    /

我可以在我的 .pyx 文件中使用 CXCYCZ,如上所示,但如果我能做一些类似 CB.X、CB.Y 和 CB.Z 的事情,那就太好了。 CX/CY/CZ 在我的模块中不会是全局的。

.pxd 中的扩展命名空间 'A::B::X' 是否可以简化或删除?

最佳答案

一种方法是使用一个非常小的 pxd 文件,在其命名空间内仅声明此枚举。这样,枚举在 Cython 代码的其余部分中就有一个简单的命名空间。我可以让它在 OS X 上编译/工作:

接口(interface).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`

关于python - 如何在 Cython 中包装匿名枚举并为其命名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42960666/

相关文章:

python - Bokeh: DateRangeSlider decreases the year by 1 when the chosen start date is Jan 1st

python - 如何在 osx 10.6.8 上安装 python 库 Pyexiv2 和 Gexiv2?

python - 我怎样才能让用户有可能编写脚本(以安全的方式)?

c# - 枚举值 '' 对于类型 > 'EnumType' 无效,无法序列化

swift - 什么决定了协议(protocol)一致性的优先级?

python - 向枚举添加属性

numpy - 在 cython 中使用日期时间和 bool

python - 如何解决错误 "error compiling Cython file"错误?

python - monkey_patch(time=True) 如何影响 eventlet.spawn?

python - 将结构中的 C 结构数组映射到 Cython