问题扩展枚举并重新定义__getitem__
问题描述:
我在Enum
的自定义子类上重新定义__getitem__
时遇到了一些问题。我的__getitem__
未被调用。我想这与Enum
的元类有关,但我不确定是什么和为什么。问题扩展枚举并重新定义__getitem__
最小工作示例(Python 3.4):
from enum import Enum, unique
@unique
class Test(Enum):
a = "a"
b = "b"
def __getitem__(self, name):
try:
return super().__getitem__(name)
except (TypeError, KeyError) as error:
print("TEST")
if __name__ == "__main__":
Test["a"]
Test["c"]
结果:
$ python test.py
Traceback (most recent call last):
File "test.py", line 18, in <module>
Test["c"]
File "C:\Development\Python\Python34\lib\enum.py", line 258, in __getitem__
return cls._member_map_[name]
KeyError: 'c'
答
As @ joca.bt指出,您并未调用Enum
子类的__getitem__()
。以下是如何解决这个问题也通过继承Enum
的元类:
from enum import Enum, EnumMeta, unique
class TestEnumMeta(EnumMeta):
def __getitem__(self, name):
try:
return super().__getitem__(name)
except (TypeError, KeyError) as error:
print("TEST")
@unique
class Test(Enum, metaclass=TestEnumMeta):
a = "a"
b = "b"
if __name__ == "__main__":
Test["a"]
Test["c"] --> TEST
可能相关:http://stackoverflow.com/q/12447036/3001761 – jonrsharpe
你为什么要重新定义'__getitem__',出于好奇? – Eevee