Python 如何从值字典构造enum.enum?
我想在运行时从配置文件生成一些类型。为了简单起见,假设我已经将数据作为python字典加载: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):
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)