我想通过类似于enum34包的字符串获取枚举:
颜色['red'] == Color.red
如果我使用boost :: python枚举,我得到:
TypeError:' type'对象没有属性' getitem '
当然,升级版本没有 getitem 方法。因此,要将此方法添加到类中,我需要覆盖元类,但在已定义的类上更改此方法看起来非常可疑。另一种可能性是创建一些代理类,但我不知道如何在全局范围内轻松应用它(返回代理的方法,包含代理而不是原始类的结构......) 还有其他可能性吗?
答案 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
中找到