我有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_of
或None
而不是提升ValueError
。每次拨打try
时,我宁愿避免使用Animal
语句。
什么是纯粹的Python等价的Enum.__call__
?
答案 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 answer,Python stdlib Enum
和enum34
backport图书馆的作者。