Python - Enums: Руководство для начинающих
Привет, будущие волшебники Python! Сегодня мы отправляемся в захватывающее путешествие в мир Enums в Python. Не волнуйтесь, если вы раньше не слышали о Enums — к концу этого урока вы будете использовать их как профи!
Что такое Enums в Python?
Представьте себе, что вы создаете игру, в которой игроки могут выбирать различные уровни сложности. Вы могли бы представить эти уровни с помощью простых строк или чисел, но что если вы случайно напечатаете уровень неправильно или используете неверное число? Вот тут на помощь приходят Enums!
Enum, сокращение от "enumeration" (перечисление), — это набор именованных значений, которые не изменяются. Это как особый список предопределенных опций, которые вы можете использовать в своем коде. Давайте погружемся в наш первый пример:
from enum import Enum
class DifficultyLevel(Enum):
EASY = 1
MEDIUM = 2
HARD = 3
В этом коде мы импортируем класс Enum из модуля enum. Затем мы создаем свой собственный Enum под названием DifficultyLevel
. У него три члена: EASY, MEDIUM и HARD, каждому из которых соответствует значение.
Почему использовать Enums?
- Читаемость: Enums делают ваш код более читаемым. Вместо использования криптографических чисел вы можете использовать значимые имена.
- Безопасность типов: Enums помогают предотвратить ошибки, обеспечивая использование только предопределенных значений.
- Организация: Они группируют связанные константы вместе, делая ваш код более организованным.
Доступ к членам Enums
Теперь, когда мы создали наш Enum, давайте узнаем, как мы можем использовать его в нашем коде.
print(DifficultyLevel.EASY) # Вывод: DifficultyLevel.EASY
print(DifficultyLevel.EASY.name) # Вывод: EASY
print(DifficultyLevel.EASY.value) # Вывод: 1
# Сравнение членов Enum
print(DifficultyLevel.EASY == DifficultyLevel.MEDIUM) # Вывод: False
print(DifficultyLevel.HARD == DifficultyLevel.HARD) # Вывод: True
Разберем это:
- Мы можем доступ к членам Enum с помощью точечной нотации.
- Атрибут
.name
дает нам имя члена Enum как строку. - Атрибут
.value
дает нам связанное значение. - Мы можем сравнивать членов Enum с помощью
==
.
Вот интересный факт: Члены Enum являются одиночными объектами. Это означает, что независимо от того, сколько раз вы ссылаетесь на DifficultyLevel.EASY
, это всегда один и тот же объект в памяти. Это как иметь лучшего друга, который всегда рядом!
Итерация по Enums
Одна из самых интересных вещей о Enums заключается в том, что мы можем итерировать по ним. Это очень полезно, когда вы хотите сделать что-то с所有的 опциями в вашем Enum.
for level in DifficultyLevel:
print(f"Сложность: {level.name}, Значение: {level.value}")
# Вывод:
# Сложность: EASY, Значение: 1
# Сложность: MEDIUM, Значение: 2
# Сложность: HARD, Значение: 3
Этот код проходит по всем членам нашего DifficultyLevel
Enum, выводя каждое имя и значение. Это как магический гид, который показывает вам все опции!
Расширенные функции Enums
Теперь, когда мы покрыли основы, давайте рассмотрим некоторые более сложные функции Enums.
Автонумерация
Если вы не хотите назначать значения вручную, Python может сделать это за вас:
from enum import Enum, auto
class Direction(Enum):
NORTH = auto()
SOUTH = auto()
EAST = auto()
WEST = auto()
print(list(Direction)) # Вывод: [<Direction.NORTH: 1>, <Direction.SOUTH: 2>, <Direction.EAST: 3>, <Direction.WEST: 4>]
Функция auto()
автоматически назначает увеличивающиеся целые значения, начиная с 1.
Использование Enums в функциях
Enums отлично подходят для параметров функций. Они делают ваши функции более надежными и самодокументирующимися:
def set_difficulty(level: DifficultyLevel):
print(f"Сложность игры установлена на: {level.name}")
set_difficulty(DifficultyLevel.HARD) # Вывод: Сложность игры установлена на: HARD
set_difficulty("EASY") # Это вызовет TypeError
Указав DifficultyLevel
как типовую подсказку для параметра level
, мы сообщаем Python (и другим разработчикам), что эта функция ожидает члена DifficultyLevel
Enum.
Методы и атрибуты Enum
Вот таблица полезных методов и атрибутов Enum:
Метод/Атрибут | Описание | Пример |
---|---|---|
Enum.name |
Возвращает имя члена Enum | DifficultyLevel.EASY.name |
Enum.value |
Возвращает значение члена Enum | DifficultyLevel.EASY.value |
Enum.__members__ |
Словарь всех членов Enum | DifficultyLevel.__members__ |
Enum(value) |
Получить члена Enum по значению | DifficultyLevel(1) |
Заключение
Поздравляем! Вы только что повысили свои навыки Python, освоив Enums. Помните, Enums — это как швейцарский армейский нож в вашем наборе инструментов для кодирования — они могут показаться простыми, но они чрезвычайно универсальны и могут сделать ваш код более чистым, безопасным и читаемым.
В следующий раз, когда вы работаете над проектом и используете набор связанных констант, подумайте о использовании Enum. Ваше будущее "я" (и любые другие разработчики, работающие с вашим кодом) вам будет благодарно!
Продолжайте программировать, учиться и помните — в мире программирования каждый день представляет собой возможность улучшить ваши навыки! (Понимаете? Enum-ерат? Ладно, я выйду сам. ?)
Credits: Image by storyset