gpt4 book ai didi

Python enum34 类似 boost python enum 的接口(interface)

转载 作者:行者123 更新时间:2023-11-30 05:31:46 24 4
gpt4 key购买 nike

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

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

如果我使用 boost::python 枚举来执行此操作,我会得到:

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

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

最佳答案

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

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());
}

可以在 https://github.com/CymricNPG/cpython/tree/enum 中找到带有 python 测试的源代码

关于Python enum34 类似 boost python enum 的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35412109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com