如何在 Python C API 中创建 Enum 对象?

Jel*_*lle 8 c python python-c-api

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

谢谢你,

耶勒

Ant*_*ala 4

这根本就不简单。这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)
Run Code Online (Sandbox Code Playgroud)

是相同的:

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)
Run Code Online (Sandbox Code Playgroud)

后者是您需要翻译成 C 的代码。