验证值在 Python 枚举值中

Jos*_*der 3 python enums

我继承了看起来像这样的代码。

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__,但是值有等价物吗?如果没有,有没有更优雅的方式来编写这段代码?

mpo*_*tes 6

您只能将值存储在普通元组(或列表)中,并使用枚举允许按值访问的事实:

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)