Python enum34类似于boost python枚举的接口

时间:2016-02-15 14:37:40

标签: python c++ boost enums

我想通过类似于enum34包的字符串获取枚举:

颜色['red'] == Color.red

如果我使用boost :: python枚举,我得到:

TypeError:' type'对象没有属性' getitem '

当然,升级版本没有 getitem 方法。因此,要将此方法添加到类中,我需要覆盖元类,但在已定义的类上更改此方法看起来非常可疑。另一种可能性是创建一些代理类,但我不知道如何在全局范围内轻松应用它(返回代理的方法,包含代理而不是原始类的结构......) 还有其他可能性吗?

1 个答案:

答案 0 :(得分:1)

我现在使用以下解决方法:

PyObject *enum_type = reinterpret_cast<PyObject *>(testEnum.ptr());

// get the metatype and make a copy
PyTypeObject *pto = reinterpret_cast<PyTypeObject *>(enum_type->ob_type);
PyTypeObject *new_pto = new PyTypeObject();
memcpy(new_pto, pto, sizeof(PyTypeObject)); 

// define a new mapping method
PyMappingMethods *mapping = new PyMappingMethods();
mapping->mp_subscript = convertEnum,

// replace the old mapping method and overwrite the meta type in the enum
new_pto->tp_as_mapping = mapping;
enum_type->ob_type = new_pto;

和枚举转换功能:

static PyObject* convertEnum(PyObject *self, PyObject *args) {
    auto resultEnum = enumfromString(PyString_AsString(args));
    return incref(object(resultEnum).ptr());
}

使用python测试的源代码可以在https://github.com/CymricNPG/cpython/tree/enum

中找到