Есть ли более удобный способ работать с Python Enum?

243 просмотра
0
0 Комментариев

Никак не могу понять как работать с python enum. Неужели нужно постоянно создавать экземпляры класса для каждого выбора? Почему такой неудобный формат работы? Есть ли что-то удобнее? Быть может я не знаю каких-то фичей при работе с enum?

#создаём класс Choise
from enum import Enum
 
class Choise(Enum):
    first = 1
    second = 2
    third = 3

Создаём 2 экземпляра класса Choise со значениями равными 3 и 1

x = Choise(3)
y = Choise(1)

Ознакамливаемся с тем, что у нас получилось

print('\n')
 
print('x -', x)
print('x.name -', x.name)
print('x.value -', x.value)
 
print('\n')
 
print('y -', y)
print('y.name -', y.name)
print('y.value -', y.value)
 
print('\n')

Осуществляем проверку на схожесть

print('x.value == y.value -', x.value == y.value)
# А вот следующая строка меня просто убивает. Самое нелогичное сравнение в мире:
# по логике, при таком обращении Choise[x.name], мы должны получить value
# по ключу x.name, но мы получаем Choise.third ... Как?!
print('x.value == Choise[x.name].value', x.value == Choise[x.name].value)
 
print('\n')

И как изменить значение у уже существующего экземпляра класса? Пробовал по логике x.value = 1, но такая форма записи райзит ошибку.

Спасибо


Добавить комментарий

1 Ответы

Python Опубликовано 09.12.2018
0

Вообще-то можно так:

x = Choise.third
y = Choise.first

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

if x == Choise.third:
    print('third:', x.value)


Да и не создаете вы новых экземпляров, можно в этом убедиться:

x = Choise(3)
 
# Все id будут одинаковыми, а значит экземпляр всегда одинаковый
print(hex(id(Choise(3))), hex(id(Choise(3))), hex(id(Choise.third)), hex(id(x)))

Из этого думаю стало понятно почему запись x.value = 1 не выполнима: объект x описывает одно из значений перечисления и является собой константой в единственном значений: один и тот же объект, неизменяемое название и значение

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up