当前,我有一个代表名称/数字映射的枚举。但是,每个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)
一样。我如何在枚举中表示这个概念?枚举甚至是正确的方法吗?
答案 0 :(得分:3)
如果您希望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
有关如何使用stdlib枚举(使用主要的__new__
技术)的示例,请参见this answer
。
1 披露:我是Python stdlib Enum
,enum34
backport和Advanced Enumeration (aenum
)库的作者。
答案 1 :(得分: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"
答案 2 :(得分:1)
在Python 3.4中,有一个新的Enum data type,您可以将其用作:
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