Enum 函数将值映射到相关值

问题描述 投票:0回答:3

目前,我有一个代表名称/号码映射的枚举。然而,每个 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"

是否有一种更干净的重构方法来返回状态代码和消息类型,而不是创建上面的方法和大量的 if 链检查自身?这几乎就像

CANCELLED = (0, statuscode1, messagetype1)
..我如何在枚举中表示这个概念?枚举是执行此操作的正确方法吗?

python python-3.x enums
3个回答
4
投票

如果您希望

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
了解如何使用 stdlib Enum 执行此操作的示例(它使用重写
__new__
技术)。


1 披露:我是 Python stdlib

Enum
enum34
向后移植
高级枚举 (
aenum
)
库的作者。


2
投票

在 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

1
投票

您可以使用元组作为

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"
© www.soinside.com 2019 - 2024. All rights reserved.