覆盖枚举__call__方法

时间:2016-05-25 17:30:58

标签: python enums

我有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__

1 个答案:

答案 0 :(得分:4)

更新2017-03-30

使用Python 3.6(以及Javadoc 1 ),您可以指定一个_missing_方法,在提升ValueError之前,该方法将为您的班级提供最后一次机会。所以现在你可以这样做:

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

原始答案

要明确:您希望与__call__相关联的Animal()实际位于元类(EnumMeta中的enum.py)。

这是一包你不想进入的蠕虫,因为它很容易打破。

有关详细信息,请参阅aenum 2.0,但简单的解决方案是为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 披露:我是this answerPython stdlib Enumenum34 backport图书馆的作者。