Валидное значение в значениях перечисления Python - PullRequest
0 голосов
/ 10 января 2019

Я унаследовал код, который выглядит примерно так:

class Clients(IntEnum):
    ALICE = 1
    BOB = 2
    PETER = 3
    CHERYL = 4
    LARRY = 5

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.')

Не имея большого опыта работы с перечислением Python, у меня есть горячее желание упростить это до чего-то вроде этого (псевдокод):

if client_id in dict(Clients).keys():
    client_info = find_info(client_id)
else:
    raise Exception('Unknown client_id.')

Я пробовал Clients.__members__ и Clients.__dict__, но они не совсем ведут себя так, как я ожидал, возвращая что-то под названием mappingproxy.

Я могу сделать 'ALICE' in Clients.__members__, но есть ли эквивалент для значений? Если нет, то есть ли более элегантный способ написать этот кусочек кода?

Ответы [ 2 ]

0 голосов
/ 10 января 2019
try:
    client_info = find_info(Clients(client_id))
except ValueError:
    # customize error message
    raise Exception('Unknown client_id.')
0 голосов
/ 10 января 2019

Вы можете хранить только значения в обычном кортеже (или списке) и использовать тот факт, что перечисления разрешают доступ по значению:

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

Или вы можете отобразить значения для перечисления членов, используя словарь:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...