我继承了看起来像这样的代码。
class Clients(IntEnum):
ALICE = 1
BOB = 2
PETER = 3
CHERYL = 4
LARRY = 5
Run Code Online (Sandbox Code Playgroud)
if client_id == 1:
client_info = find_info(Clients.ALICE.value)
elif client_id == 2:
client_info = find_info(Clients.BOB.value)
elif client_id == 3:
client_info = find_info(Clients.PETER.value)
elif client_id == 4:
client_info = find_info(Clients.CHERYL.value)
elif client_id == 5:
client_info = find_info(Clients.LARRY.value)
else:
raise Exception('Unknown client_id.')
Run Code Online (Sandbox Code Playgroud)
对 Python 枚举没有太多经验,我强烈希望将其简化为这样的(伪代码):
if client_id in dict(Clients).keys():
client_info = find_info(client_id)
else:
raise Exception('Unknown client_id.')
Run Code Online (Sandbox Code Playgroud)
我试过Clients.__members__
and Clients.__dict__
,但它们的行为并不像我期望的那样,返回了一个叫做 a 的东西mappingproxy
。
我可以做'ALICE' in Clients.__members__
,但是值有等价物吗?如果没有,有没有更优雅的方式来编写这段代码?
您只能将值存储在普通元组(或列表)中,并使用枚举允许按值访问的事实:
values = tuple(item.value for item in Clients)
if client_id in values:
# do something with Clients(client_id)
else:
# print message or raise exception
Run Code Online (Sandbox Code Playgroud)
或者您可以使用字典将值映射到枚举成员:
mapping = dict((item.value, item) for item in Clients)
if client_id in mapping:
# do something with mapping[client_id]
else:
# print message or raise exception
Run Code Online (Sandbox Code Playgroud)