问题扩展枚举并重新定义__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' 
+3

可能相关:http://stackoverflow.com/q/12447036/3001761 – jonrsharpe

+0

你为什么要重新定义'__getitem__',出于好奇? – Eevee

如果你在Enum实例使用方括号你的__getitem__压倒一切的将被调用。

访问它像Test["A"]将调用元类的__getitem__方法。因此,对于您的情况,您需要继承EnumMeta元类,覆盖其__getitem__,然后使用该元类创建您自己的枚举类。

你可以看看源代码here

+0

我不应该用@classmethod解决它吗? –

+0

没有。在阅读@jonrsharpe – shx2

+1

发布的链接中的答案之后,应该清楚我在看到有评论之前实际询问的答案。现在确实有一些意义。 –

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