Python 如何从值字典构造enum.enum?

Python 如何从值字典构造enum.enum?,python,enums,python-3.4,Python,Enums,Python 3.4,我想在运行时从配置文件生成一些类型。为了简单起见,假设我已经将数据作为python字典加载: color_values = dict(RED = 1, YELLOW = 2, GREEN = 3) 如何将其转换为类型(使用) 下面的方法不起作用 def make_enum(name, values): return type(name, (enum.Enum,), values) 这里有一个超级黑客的方法似乎是有效的: def make_enum(name, values):

我想在运行时从配置文件生成一些类型。为了简单起见,假设我已经将数据作为python字典加载:

color_values = dict(RED = 1, YELLOW = 2, GREEN = 3)
如何将其转换为类型(使用)

下面的方法不起作用

def make_enum(name, values):
    return type(name, (enum.Enum,), values)

这里有一个超级黑客的方法似乎是有效的:

def make_enum(name, values):
    _k = _v = None
    class TheEnum(enum.Enum):
        nonlocal _k, _v
        for _k, _v in values.items():
            locals()[_k] = _v
    TheEnum.__name__ = name
    return TheEnum

我们必须使用
nonlocal
在那里停止
Enum
抱怨键
k
v
被复制。

和另一个选择点击元类内部的键:

def make_enum(name, values):
    meta = type(enum.Enum)
    bases = (enum.Enum,)
    dict = meta.__prepare__(name, bases)
    for k, v in values.items():
        dict[k] = v
    return meta(name, bases, dict)
或使用更少的
\uuuu dunder\uuuu

import types
def make_enum(name, values):
    def _update(d1, d2):
        for k, v in d2.items():
            d1[k] = v  # calls __setitem__
    return types.new_class(name, (enum.Enum,), None, lambda ns: _update(ns,values))

有一个提供的API。您还可以给它一个名-值对的iterable,或一个仅名的iterable(在这种情况下,值将从1开始自动填充),或一个以空格或逗号分隔的名称字符串(也将自动填充值)。

您可能应该使用OrderedDict而不是常规dict。相关:@IoannisFilippidis:为我辩护,我记得那个问题是enum.enum之前的一个问题,它会告诉我如何使用它。当然,你是对的,它展示了我需要的例子。
def make_enum(name, values):
    meta = type(enum.Enum)
    bases = (enum.Enum,)
    dict = meta.__prepare__(name, bases)
    for k, v in values.items():
        dict[k] = v
    return meta(name, bases, dict)
import types
def make_enum(name, values):
    def _update(d1, d2):
        for k, v in d2.items():
            d1[k] = v  # calls __setitem__
    return types.new_class(name, (enum.Enum,), None, lambda ns: _update(ns,values))
Color = Enum('Color', color_values)