我有一个Enum像这样:
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。
__call__
Animal('hee- haw')
Animals.never_heard_of
None
ValueError
try
Animal
纯Python等效于Enum.__call__什么?
Enum.__call__
更新2017-03-30
使用Python 3.6(和1),您可以指定一个方法,该方法将被调用以使类在升起前有最后机会。现在,您可以执行以下操作:aenum 2.0_missing_``ValueError
aenum 2.0
_missing_``ValueError
@classmethod def _missing_(cls, name): return cls.never_heard_of
原始答案
需要明确的是:你想要的__call__是与关联Animal()实际上这是对元类(EnumMeta中enum.py)。
Animal()
EnumMeta
enum.py
这是一袋您不想进入的蠕虫,因为它很容易破坏东西。
请参阅此答案以获取更多详细信息,但是简单的解决方案是get为您的Animal枚举创建一个方法:
get
@classmethod def get(cls, name): try: return cls[name] except KeyError: return cls.never_heard_of
然后Animal.get('wolf')将返回Animal.never_heard_of。
Animal.get('wolf')
Animal.never_heard_of
1披露:我是Python stdlibEnum,enum34backport和Advanced Enumeration(aenum) 库的作者。
enum34
aenum