如何在cython中访问枚举?

时间:2017-10-19 20:31:31

标签: python c++ enums cython

我有一个很大的c ++代码,我在cython中包装来从python调用。我不确定如何在cython中调用enum的内容。这是我已经尝试过的。但这还不完整。救命!

演示示例

class Foo{
public:
   Foo1 bar(enum_is type = enum::any) const;
}
enum class enum_is:unsigned int{
 any = 0,
 one = 1,
 two = 2,
}; 

abc.pxd

cdef extern from "headerfile.hpp":
    cdef cpp class enum_is:
        pass

cdef extern from "headerfile.hpp" namespace "enum_is":
    cdef enum_is any
    cdef enum_is one
    cdef enum_is two

abc.pyx

cdef class Pyenum_is:
    cdef enum_is thisobj
            def __cinit__(self,unsigned int val):
                self.pin_isthisobj = <pin_is> val
            def get_pin_is_type(self)
                cdef r={<unsigned int> any:"any",
                        <unsigned int> one:"one",
                        <unsigned int> two:"two"
                       }
                return r[<unsigned int>self.thisobj]

我需要有关如何在python中实际使用枚举的函数的帮助,假设我有正确包装的枚举类

cdef class PyFoo1
    cdef Foo1 Foo1thisobj
    cdef Foo1* Foo1thisptr

cdef class PyFoo
    cdef Foo Foothisobj
    cdef Foo* Foothisptr
    def bar(self,#pass enum_is object here):
        cdef Foo tempv = self.thisobj.bar(#pass enum here)
        abc = PyFoo()
        abc.Foo1thisobj = tempv
        return abc

有人可以帮我解决如何在cython中使用这个枚举

1 个答案:

答案 0 :(得分:0)

您可以在Cython中声明枚举,如

ctypedef enum options: OPT1, OPT2, OPT3

然后举个例子:

def main():
    cdef options test
    test = OPT2
    f(test)

cdef void f(options inp):
    if inp == OPT1:
        print('OPT1')
    elif inp == OPT2:
        print('OPT2')
    elif inp == OPT3:
        print('OPT3')