Overriding Enum __call__ method
我有一个这样的Enum:
1 2 3 4 5 6 7 8 9 10
| 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。每次我打电话给Animal时,我都会避免使用try声明。
纯python与Enum.__call__的等价物是什么?
- 你为什么不直接用如dict(cat='meow', dog='woof').get(whatever)?这似乎是对枚举器的一种奇怪的使用。
- @乔恩:我在寻找一组不变的常数。如果未定义常量,则返回"无"。我可以在程序中设置逻辑门,告诉我将与哪个电子表格软件交互。
- 请给出一些上下文,否则这可能是一个xy问题。
更新日期:2017-03-30
使用python 3.6(和aenum 2.01),您可以指定一个_missing_方法,在提升ValueError之前,该方法将被调用以给类最后一次机会。现在你可以做:
1 2 3
| @classmethod
def _missing_(cls, name):
return cls.never_heard_of |
原始答案
要明确的是:你想要与Animal()相关的__call__,它实际上是在元类上(EnumMeta在enum.py中)。
这是一袋你不想钻进去的虫子,因为很容易弄坏东西。
有关详细信息,请参见此答案,但简单的解决方案是为您的Animal枚举创建一个get方法:
1 2 3 4 5 6
| @classmethod
def get(cls, name):
try:
return cls[name]
except KeyError:
return cls.never_heard_of |
号
然后Animal.get('wolf')返回Animal.never_heard_of。
1公开:我是python stdlib Enum、enum34backport和advanced enumeration(aenum库的作者。
- 听起来有点像潘多拉的盒子,但最后没有希望…谢谢你这条有用的建议。