我有一个简单的 Python 2.7 枚举:
from enum import Enum
class Label(enum):
RedApple = 1
GreenApple = 2
我希望能够使用不区分大小写的键创建枚举对象:
fruitname = "redapple"
a = Label[fruitname]
我试图创建一个 __init__
方法:
def __init__(self, key):
super(Label, self).__init__()
pass # do comparison here
但我一直遇到错误:
super(Label, self).__init__()
NameError: global name 'Label' is not defined
我想对 key.lower().strip()
进行比较。这可能吗?
最佳答案
在 Python 3.6 和 aenum 2.0
中12(与 2.7 和 3.0+ 兼容)添加了一个新方法:_missing_
2。
在引发 ValueError
之前调用此方法,使自定义代码有机会尝试按值查找枚举成员。不幸的是,这使得它不适合您的用例——按名称查找。
幸运的是,aenum
有一个额外的选项,可以定义一个 _missing_name_
方法3,当名称查找失败时将调用该方法。
你上面的代码应该是这样的:
from aenum import Enum
class Label(Enum):
RedApple = 1
GreenApple = 2
@classmethod
def _missing_name_(cls, name):
for member in cls:
if member.name.lower() == name.lower():
return member
并在使用中:
>>> Label['redapple']
<Label.RedApple: 1>
如果坚持使用 3.6 stdlib(或想与其保持兼容),您可以(ab)使用 _missing_
但是:
- 您将不得不执行
Label('redapple')
(圆括号,而不是方括号),并且 - 您将反对枚举的设计('redapple' 是名称,而不是值)
1 披露:我是 Python stdlib Enum
的作者, enum34
backport , 和 Advanced Enumeration (aenum
)图书馆。
2 enum34
没有这些改进,因为它只是为了修复错误而维护。
3 _missing_value_
在 aenum
中是首选,因为它更明确地说明了它正在检查的内容,但它又回到了 _missing_
与 stdlib 的兼容性。
4 aenum v2.0.2 有一个错误,如果 _missing_name_
没有被覆盖,则为值和名称调用 _missing_
-- 这个在 v2.0.3+ 中修复。
关于python - 如何构建不区分大小写的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42658609/