我正在使用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
文件中使用CY
,CZ
和.pyx
,如上所示,但如果我可以执行类似{{1 },CB.X
和CB.Y
,即。 CB.Z
在我的模块中不会是全局的。
CX/CY/CZ
中的扩展名称空间'A::B::X'
也可以简化或删除吗?
答案 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`