Функция перечисления для сопоставления значения с соответствующим значением - PullRequest
0 голосов
/ 11 октября 2018

В настоящее время у меня есть enum, который представляет сопоставление имени / номера.Каждый EventType, однако, также имеет дополнительные «связанные свойства» (например, код состояния и тип сообщения).

class EventType(Enum):
  CANCELLED = 0
  ONTIME = 1
  DELAYED = 2

  def get_status(self):
    if self == EventType.CANCELLED:
        return "statuscode1"
    elif self == EventType.DELAYED:
        return "statuscode2"
    else:
        return "statuscode3"

  def get_message_type(self):
    if self == EventType.CANCELLED:
        return "messagetype1"
    elif self == EventType.DELAYED:
        return "messagetype2"
    else:
        return "messagetype3"

Вместо создания описанных выше методов и множества цепочек, проверяющих себя, естьболее чистый способ рефакторинга для возврата кодов состояния и типов сообщений?Это почти как если бы CANCELLED = (0, statuscode1, messagetype1) .. Как я могу представить эту концепцию в перечислении?Является ли enum даже правильным способом сделать это?

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

В Python 3.4 есть новый тип данных Enum , который вы можете использовать как:

class EventType(Enum):

    def __init__(self, id, code, message):
        self.id = id
        self.code = code
        self.message = message

    CANCELLED = 1, 'code1', 'message1'
    ONTIME = 2, 'code2', 'message2'
    DELAYED = 3, 'code3', 'message3

Для использования просто:

EventType.CANCELLED.code # returns 'message1'

Если это только тот случай использования, который вы описали, вы также можете использовать именованный кортеж, если хотите:

from collections import namedtuple

    Event = namedtuple('event', ['id', 'code', 'message'])

    class EventType:
        CANCELLED = Event(1, 'code1', 'message1')
        ONTIME = Event(2, 'code2', 'message2')
        DELAYED = Event(3, 'code3', 'message3')

Для использования этого:

EventType.CANCELLED # return event(id=1, code='code1', message='message1')
EventType.CANCELLED.message # return message1
0 голосов
/ 11 октября 2018

Если вы хотите, чтобы значение элемента Enum было 0, 1 или 2, то вам нужно либо переопределить __new__, либо использовать aenum.

Использование библиотеки aenum 1 :

from aenum import MultiValueEnum

class EventType(MultiValueEnum):
    _init_ = 'value status message'
    CANCELLED = 0, 'status1', 'message1'
    ONTIME = 1, 'status2', 'message2'
    DELAYED = 2, 'status3', 'message3'

и при использовании:

>>> print(EventType.ONTIME)
EventType.ONTIME
>>> print(EventType.ONTIME.value)
1
>>> print(EventType.ONTIME.status)
status2
>>> print(EventType.ONTIME.message)
message2

См. this answer дляпример того, как сделать это с помощью enum stdlib (который использует переопределенную технику __new__).


1 Раскрытие информации: я являюсь автором Python stdlibEnum, enum34 backport и расширенное перечисление (aenum) .

0 голосов
/ 11 октября 2018

Вы можете использовать кортеж в качестве значения ваших Enum объектов и включать строки состояния и сообщения вместе с целочисленным кодом.Затем вы можете добавить методы (или property дескрипторы) для извлечения отдельных фрагментов кортежа с помощью атрибута value:

class EventType(Enum):
   CANCELLED = 0, "status1", "message1"
   ONTIME = 1, "status2", "message2"
   DELAYED = 2, "status3", "message3"

   @property
   def code(self):
       return self.value[0]

   @property
   def status(self):
       return self.value[1]

   @property
   def message(self):
       return self.value[2]

print(EventType.CANCELLED.message) # prints "message3"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...