重写枚举调用方法

2024-10-05 12:18:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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或{},而不是引发{}。我宁愿在每次调用Animal时避免使用try语句。在

什么是一个纯粹的Python等价物Enum.__call__?在


Tags: offromimportselfenumcallclasscat
1条回答
网友
1楼 · 发布于 2024-10-05 12:18:50

更新2017-03-30

在Python3.6(和^{}1)中,您可以指定一个_missing_方法,该方法将被调用以在引发ValueError之前给您的类最后一次机会。现在您可以:

    @classmethod
    def _missing_(cls, name):
        return cls.never_heard_of

原始答案

明确一点:您需要与__call__相关联的Animal(),它实际上在元类中(EnumMeta在{}中)。在

这是一袋你不想进去的虫子,因为很容易弄坏东西。在

有关详细信息,请参见this answer,但简单的解决方案是为您的Animal枚举创建一个get方法:

^{pr2}$

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


1公开:我是Python stdlib ^{}^{} backport和{a5}库的作者。在

相关问题 更多 >

    热门问题