首页 > 解决方案 > 如何在 Python C API 中创建枚举对象?

问题描述

我正在努力如何在 Python C API 中创建一个 python Enum 对象。枚举类已分配tp_basePyEnum_Type,因此它继承了 Enum。但是,我想不出一种方法来告诉 Enum 基类枚举中有哪些项目。我想允许使用__members__每个 Python Enum 提供的属性从 Python 进行迭代和查找。

谢谢,

耶勒

标签: pythoncpython-c-api

解决方案


这一点都不简单。这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 的代码。


推荐阅读