问题扩展枚举并重新定义__getitem__

joc*_*.bt 8 enums python-3.x

我在重新定义__getitem__自定义子类时遇到了一些麻烦Enum.我__getitem__没被打电话.我想它与Enum元类有关,但我不确定是什么和为什么.

最小的工作示例(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"]
Run Code Online (Sandbox Code Playgroud)

结果:

$ 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'
Run Code Online (Sandbox Code Playgroud)

mar*_*eau 7

正如@ shx2指出的那样,你没有调用__getitem__()你的Enum子类.以下是如何通过子类化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
Run Code Online (Sandbox Code Playgroud)


shx*_*hx2 6

你的首要__getitem__如果你在使用方括号将被调用实例Enum.

Test["A"]调用__getitem__元类的方法一样访问它.所以在你的情况下,你需要继承EnumMeta元类,重写它__getitem__,然后用该元类创建自己的枚举类.

您可以在这里查看源代码.