【发布时间】:2019-09-04 21:14:10
【问题描述】:
我必须在 Enum 中创建一个额外的映射来保存额外的信息,例如每个枚举案例的详细描述,但不会丢失 Enum 类属性。例如:
class MyEnumBase:
description = {
1: 'Description 1',
2: 'This is anover description',
3: 'la la la',
}
class MyEnum(MyEnumBase, Enum):
First = 1
Second = 2
Third = 3
所以我这样访问它:
MyEnum.description[3] == 'la la la'.
如何扩展 Enum 类,以便在描述与枚举名称相同的情况下,它会使用字段名称填充此字典?
例如:
class MyAnotherEnum(CustomEnumBase):
aaa = 1
bbb = 2
ccc = 3
这样MyAnotherEnum.description[3] == 'ccc' 会自动为从此CustomEnumBase 创建的每个枚举生成description 属性。
我尝试扩展 Enum 类,但我尝试过的所有事情都失败了。我在想这样的事情:
class CustomEnumBase:
@property
def names(cls):
return {
id:member.name
for id, member in cls._value2member_map_.items()
}
有两个限制:
它应该扩展 python Enum 类,因此期望 Enum 的地方它的行为正确。有一些第三方代码依赖于此。
它应该保持对描述的访问作为映射,因为这个协议已经被预期并在代码库中使用。因此将其更改为
MyAnotherEnum.description()[id]是不可行的,因为它需要一个映射(dict),而不是一个函数。
【问题讨论】:
-
为什么首先需要使用
descriptiondict?MyAnotherEnum(3).value将返回ccc,而MyAnotherEnum['ccc']返回 3 -
可以更多地解释您希望通过枚举类实现的目标。正如 chen 所说,您的用例似乎不需要任何枚举扩展
-
我的枚举具有 id(数字)和枚举名称。有时,我需要对此枚举进行详细描述。对于这种情况,我发现有一种方法可以在不丢失 Enum 协议/api 的情况下对其进行封装。
-
重点是有很多新的情况,描述名称与名称相同,所以不是在每个新的 Enum 中创建这种重复的代码,而是创建一种以编程方式使描述为枚举本身的名称。并且在需要时,在描述不同时手动覆盖描述。
标签: python python-3.x class enums