关于python:重写Enum __call__方法

Overriding Enum __call__ method

我有一个这样的Enum

1
2
3
4
5
6
7
8
9
10
from enum import Enum

class Animal(Enum):

     cat = 'meow'
     dog = 'woof'
     never_heard_of = None

     def talk(self):
         print(self.value)

我想重写__call__方法,以便像Animal('hee-haw')这样的调用返回Animals.never_heard_ofNone而不是提升ValueError。每次我打电话给Animal时,我都会避免使用try声明。

纯python与Enum.__call__的等价物是什么?


更新日期:2017-03-30

使用python 3.6(和aenum 2.01),您可以指定一个_missing_方法,在提升ValueError之前,该方法将被调用以给类最后一次机会。现在你可以做:

1
2
3
    @classmethod
    def _missing_(cls, name):
        return cls.never_heard_of

原始答案

要明确的是:你想要与Animal()相关的__call__,它实际上是在元类上(EnumMetaenum.py中)。

这是一袋你不想钻进去的虫子,因为很容易弄坏东西。

有关详细信息,请参见此答案,但简单的解决方案是为您的Animal枚举创建一个get方法:

1
2
3
4
5
6
    @classmethod
    def get(cls, name):
        try:
            return cls[name]
        except KeyError:
            return cls.never_heard_of

然后Animal.get('wolf')返回Animal.never_heard_of

1公开:我是python stdlib Enumenum34backport和advanced enumeration(aenum库的作者。