Python 枚举函数将值映射到相关值

Python 枚举函数将值映射到相关值,python,python-3.x,enums,Python,Python 3.x,Enums,目前,我有一个表示名称/编号映射的枚举。但是,每个事件类型还具有其他“相关属性”(例如状态代码和消息类型) 有没有更干净的重构方法来返回状态代码和消息类型,而不是创建上面的方法和大量的if链来检查self?这几乎就像CANCELLED=(0,statuscode1,messagetype1)。。如何在枚举中表示此概念?枚举是否是执行此操作的正确方法?您可以使用元组作为enum对象的值,并将状态和消息字符串与整数代码一起包括在内。然后,您可以添加方法(或属性描述符),通过值属性获取元组的各个片段:

目前,我有一个表示名称/编号映射的枚举。但是,每个事件类型还具有其他“相关属性”(例如状态代码和消息类型)


有没有更干净的重构方法来返回状态代码和消息类型,而不是创建上面的方法和大量的if链来检查self?这几乎就像
CANCELLED=(0,statuscode1,messagetype1)
。。如何在枚举中表示此概念?枚举是否是执行此操作的正确方法?

您可以使用元组作为
enum
对象的值,并将状态和消息字符串与整数代码一起包括在内。然后,您可以添加方法(或
属性
描述符),通过
属性获取元组的各个片段:

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"

在Python 3.4中,有一个新的

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

如果希望
Enum
成员的值为
0
1
2
,则需要覆盖
\uuuuu new\uuuuu
,或使用
aenum

使用
aenum
library1:

在使用中:

>>> print(EventType.ONTIME)
EventType.ONTIME
>>> print(EventType.ONTIME.value)
1
>>> print(EventType.ONTIME.status)
status2
>>> print(EventType.ONTIME.message)
message2
有关如何使用stdlib Enum执行此操作的示例,请参见(它使用覆盖的
\uuuu new\uuu
技术)



1披露:我是《圣经》、《圣经》和《图书馆》的作者。

这是一个怎样重复的问题?我在OP中已经有了表示枚举的代码。我认为它是重复的,因为如果您看到该问题的一些最重要的答案,您可以找到用python实现枚举的方法。@MrAlihoseiny:OP不是问如何实现枚举类型,而是问如何使用现有的
enum
type.Neat!但是,此方法将
成员.value
保留为元组,而不是
int
。我将尝试此方法以及上面的aenum方法答案。谢谢你们两位!很好地使用
\uuuu init\uuuu
。但是,如果OP需要将值设置为
0
1
2
,则应改为覆盖
\uuuuu new\uuuu
。参见示例。最终采用了这种方法。另一种方法也很好,很干净,但这种方法似乎更容易一些。谢谢
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