覆盖枚举 __call__ 方法

Jac*_*din 3 python enums

我有一个Enum这样的:

from enum import Enum

class Animal(Enum):

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

     def talk(self):
         print(self.value)
Run Code Online (Sandbox Code Playgroud)

我想覆盖该__call__方法,以便像Animal('hee-haw')返回Animals.never_heard_ofNone而不是 raise 之类的调用 ValueError。我宁愿避免try每次调用Animal.

什么是纯 Python 等价物Enum.__call__

Eth*_*man 5

更新 2017-03-30

使用 Python 3.6(和1),您可以指定一个方法,该方法将被调用,以便在提高. 所以现在你可以这样做:aenum 2.0_missing_ValueError

    @classmethod
    def _missing_(cls, name):
        return cls.never_heard_of
Run Code Online (Sandbox Code Playgroud)

原答案

需要明确的是:您希望__call__Animal()实际上在元类(EnumMetain enum.py)上的相关联。

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

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

    @classmethod
    def get(cls, name):
        try:
            return cls[name]
        except KeyError:
            return cls.never_heard_of
Run Code Online (Sandbox Code Playgroud)

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


1披露:我是Python stdlibEnumenum34backportAdvanced Enumeration ( aenum) 库的作者。