2016-05-25 6 views
2

У меня есть Enum так:Перекрытие Enum __call__ метод

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

Почему бы вам просто не использовать, например. 'dict (cat = 'meow', dog = 'woof'). get (что угодно)'? Это похоже на странное использование перечислителя. – jonrsharpe

+1

@jonrsharpe: Я был после неизменного набора констант. Если константа не определена, она возвращает None. У меня могут быть логические логики в моей программе, чтобы рассказать мне о том, с каким программным обеспечением с электронными таблицами я буду взаимодействовать. –

+0

Просьба указать контекст, в противном случае это, скорее всего, проблема [XY] (http://meta.stackexchange.com/q/66377/248731). – jonrsharpe

ответ

2

Обновление 2017-03-30

С Python 3.6 (и aenum 2.0) вы можете указать _missing_ метод, который будет вызван, чтобы дать вашему классу последний шанс, прежде чем поднять ValueError. Итак, теперь вы можете сделать:

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

Оригинал ответа

Чтобы быть ясно: вы хотите __call__, связанный с Animal(), которая на самом деле на метакласса (EnumMeta в enum.py).

Это мешок с червями, с которыми вы не хотите попасть, так как очень легко сломать вещи.

См this answer для получения более подробной информации, но простое решение заключается в создании способа 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.


Раскрытие: Я автор Python stdlib Enum, то enum34 backport и Advanced Enumeration (aenum) библиотека.

+0

Это похоже на коробку Пандоры, но без Надежды в конце ... Спасибо за этот полезный совет. –