jdi*_*jdi 11 c++ python enums nested cython
这是我在一天半前在cython用户组中提出的一个问题的交叉帖子,但还没有得到任何回复,所以我在一个更一般的论坛上试试我的运气
我一直在尝试用以下方法来包装以下代码,并且存在各种程度的错误.大量的搜索使我绊倒了类似的问题,也是一张出色的心愿单,但说实话,我不确定我是否在正确的道路上.
plow_types.h:
namespace Plow {
struct JobState {
enum type {
INITIALIZE = 0,
RUNNING = 1,
FINISHED = 2
};
};
...
class JobFilterT {
public:
...
std::vector<JobState::type> states;
...
Run Code Online (Sandbox Code Playgroud)
所以我试图包装这个Plow::JobState::type枚举.在找到另一个类似的帖子后,我得到的最接近的结果就是这次尝试:
plow_types.pxd:
cdef extern from "rpc/plow_types.h" namespace "Plow":
enum JobState_type "Plow::JobState::type":
INITIALIZE "Plow::JobState::INITIALIZE"
RUNNING "Plow::JobState::RUNNING"
FINISHED "Plow::JobState::FINISHED"
struct JobState:
JobState_type type
...
cdef cppclass JobFilterT:
vector[JobState_type] states
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
src/plow.cpp: In function ‘std::vector<Plow::JobState::type, std::allocator<Plow::JobState::type> > __pyx_convert_vector_from_py_enum__Plow_3a__3a_JobState_3a__3a_type(PyObject*)’:
src/plow.cpp:6688: error: invalid conversion from ‘long int’ to ‘Plow::JobState::type’
Run Code Online (Sandbox Code Playgroud)
我一直在努力,只是简单地定义自己的常量的版本我用Cython PYX和对待一切,INT( vector[int] states),但编译器抱怨不知道如何从做转换int long到Plow::JobState::type.
在尝试了令人难以置信的数量组合后,我终于想通了.在提出这个问题之前,我离上次的尝试还有一段距离......
plow_types.pxd:
我需要忘记那个JobState结构,只包装枚举.但我还需要将它们映射到cython中的新名称,以避免使用类似命名空间技术与其他枚举进行名称冲突.
cdef extern from "rpc/plow_types.h" namespace "Plow":
ctypedef enum JobState_type "Plow::JobState::type":
JOBSTATE_INITIALIZE "Plow::JobState::INITIALIZE"
JOBSTATE_RUNNING "Plow::JobState::RUNNING"
JOBSTATE_FINISHED "Plow::JobState::FINISHED"
Run Code Online (Sandbox Code Playgroud)
现在我可以参考JobState_type类似的东西vector[JobState_type].然后我用这种方法以一种只读的方式在python中使我的常量可用:
job.pyx:
cimport cython
@cython.internal
cdef class _JobState:
cdef:
readonly int INITIALIZE
readonly int RUNNING
readonly int FINISHED
def __cinit__(self):
self.INITIALIZE = JOBSTATE_INITIALIZE
self.RUNNING = JOBSTATE_RUNNING
self.FINISHED = JOBSTATE_FINISHED
JobState = _JobState()
Run Code Online (Sandbox Code Playgroud)
这给了我一个公共实例JobState,具有只读常量属性.
当需要从python值列表转换回来时vector[JobState_type],我会这样做:
someList = [JobState.RUNNING]
...
cdef:
JobState_type i
vector[JobState_type] vec_states
for i in someList:
vec_states.push_back(i)
Run Code Online (Sandbox Code Playgroud)