gpt4 book ai didi

python - 如何使用其他方法从现有字典创建 Python Enum 类?

转载 作者:太空宇宙 更新时间:2023-11-03 14:38:41 24 4
gpt4 key购买 nike

比方说,我有一个预先存在的映射作为字典:

value_map = {'a': 1, 'b': 2}

我可以这样创建一个枚举类:

from enum import Enum
MyEnum = Enum('MyEnum', value_map)

然后像这样使用它

a = MyEnum.a
print(a.value)
>>> 1
print(a.name)
>>> 'a'

然后我想为我的新枚举类定义一些方法:

def double_value(self):
return self.value * 2

当然,我可以这样做:

class MyEnum(Enum):
a = 1
b = 2
@property
def double_value(self):
return self.value * 2

但是正如我所说,我必须使用预定义的值映射字典,所以我不能这样做。如何实现?我试图从另一个定义此方法的类(如混合宏)继承,但我无法弄明白。

最佳答案

您可以使用 mixin 方法将基类型传递给函数式 API,使用 type 参数:

>>> import enum
>>> value_map = {'a': 1, 'b': 2}
>>> class DoubledEnum:
... @property
... def double_value(self):
... return self.value * 2
...
>>> MyEnum = enum.Enum('MyEnum', value_map, type=DoubledEnum)
>>> MyEnum.a.double_value
2

对于从不使用 class 语句的全功能方法,您可以使用 type() function 创建基础混合:

DoubledEnum = type('DoubledEnum', (), {'double_value': property(double_value)})
MyEnum = enum.Enum('MyEnum', value_map, type=DoubledEnum)

您还可以以相同的方式使用 enum.EnumMeta() 元类,就像 Python 在您创建 class MyEnum(enum.Enum) 时的方式:...子类:

  1. 使用元类创建类字典 __prepare__ hook
  2. 调用元类,传入类名、基(此处为(enum.Enum,))和在步骤 1 中创建的类字典。

enum.EnumMeta 使用的自定义字典子类并不是真正为便于重用而设计的;它实现了一个 __setitem__ 钩子(Hook)来记录元数据,但没有覆盖 dict.update() 方法,所以我们在使用你的 时需要小心value_map 字典:

import enum

def enum_with_extras(name, value_map, bases=enum.Enum, **extras):
if not isinstance(bases, tuple):
bases = bases,
if not any(issubclass(b, enum.Enum) for b in bases):
bases += enum.Enum,
classdict = enum.EnumMeta.__prepare__(name, bases)
for key, value in {**value_map, **extras}.items():
classdict[key] = value
return enum.EnumMeta(name, bases, classdict)

然后将 double_value=property(double_value) 传递给该函数(连同枚举名称和 value_map 字典):

>>> def double_value(self):
... return self.value * 2
...
>>> MyEnum = enum_with_extras('MyEnum', value_map, double_value=property(double_value))
>>> MyEnum.a
<MyEnum.a: 1>
>>> MyEnum.a.double_value
2

否则您可以创建没有成员的枚举的子类(任何 descriptor 都不是成员,因此函数、属性、类方法等),因此您可以定义一个首先没有成员的枚举:

class DoubledEnum(enum.Enum):
@property
def double_value(self):
return self.value * 2

对于功能性 API(例如 enum.Enum(..., type=DoubledEnum))和我编码为 enum_with_extras( )

关于python - 如何使用其他方法从现有字典创建 Python Enum 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55220588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com