我有一个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_of或None而不是 raise 之类的调用 ValueError。我宁愿避免try每次调用Animal.
什么是纯 Python 等价物Enum.__call__?
更新 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 stdlibEnum、enum34backport和Advanced Enumeration ( aenum) 库的作者。