python - 如何在 Python C API 中创建枚举对象?
问题描述
我正在努力如何在 Python C API 中创建一个 python Enum 对象。枚举类已分配tp_base
给PyEnum_Type
,因此它继承了 Enum。但是,我想不出一种方法来告诉 Enum 基类枚举中有哪些项目。我想允许使用__members__
每个 Python Enum 提供的属性从 Python 进行迭代和查找。
谢谢,
耶勒
解决方案
这一点都不简单。这Enum
是一个使用 Python 元类的Python 类。可以在 C 中创建它,但它只是在 C 中模拟构建 Python 代码 - 最终结果是相同的,虽然它稍微加快了速度,但您很可能在每个程序运行中只运行一次代码。
无论如何,这是可能的,但一点也不容易。我将展示如何在 Python 中做到这一点:
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
print(Color)
print(Color.RED)
是相同的:
from enum import Enum
name = 'Color'
bases = (Enum,)
enum_meta = type(Enum)
namespace = enum_meta.__prepare__(name, bases)
namespace['RED'] = 1
namespace['GREEN'] = 2
namespace['BLUE'] = 3
Color = enum_meta(name, bases, namespace)
print(Color)
print(Color.RED)
后者是您需要翻译成 C 的代码。
推荐阅读
- mongodb - 从现有的 MongoDB 集合生成 JSON 模式
- azure-cosmosdb - 如何使用 azure cosmos DB 中的查询检查子节点是否为空
- python-3.x - python烧瓶测试站点在IIS服务器上不起作用,但是它在本地主机上工作
- c# - 将 DataTable 转换为 JSON - 如果一个为空,则过滤掉所有子级
- regex - regexp_match 不适用于谷歌数据工作室中带有特殊字符的文本字符串
- python - 如何获得每组连续相同单词超过 X 次的平均值?
- python - 在 Python 中,如何使用日期时间作为条件进行合并(不准确,但有一些时间差异)
- c# - 具有太多包含异常的 Linq 查询
- android - 具有两种不同采样率的 PCM 音频混合不起作用
- python - 试图找到 python 脚本文件的位置以作为变量值添加到 PATH 变量