小编典典

重写Enum __call__方法

python

我有一个Enum像这样:

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。我宁愿try每次打电话都不要发表声明Animal

纯Python等效于Enum.__call__什么?


阅读 275

收藏
2020-12-20

共1个答案

小编典典

更新2017-03-30

使用Python 3.6(和1),您可以指定一个方法,该方法将被调用以使类在升起前有最后机会。现在,您可以执行以下操作:aenum 2.0_missing_``ValueError

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

原始答案

需要明确的是:你想要的__call__是与关联Animal()实际上这是对元类(EnumMetaenum.py)。

这是一袋您不想进入的蠕虫,因为它很容易破坏东西。

请参阅此答案以获取更多详细信息,但是简单的解决方案是get为您的Animal枚举创建一个方法:

    @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
stdlibEnum
enum34backportAdvanced
Enumeration(aenum
库的作者。

2020-12-20