Як Enums у Python покращують читабельність коду

Переліки є популярним типом даних у таких мовах програмування, як C, C++ і Java. Вони допомагають вам писати безпечний і читабельний код.

У Python переліки не завжди підтримувалися. Однак, починаючи з версії 3.4, Python тепер підтримує переліки. Ця стаття є посібником про те, як створювати переліки, як ними користуватися та як вони покращують читабельність коду.

Що таке Enum і що вони роблять?

Enum або enumeration — це тип даних, визначений набором значень, які він може приймати. Цей набір значень називається його набором членів. Переліки дають змогу точніше визначити значення, які може мати змінна. Це допоможе вам написати безпечний код. Це також покращує читабельність.

Деякі умови, які варто знати

Коли ми обговорюємо enum, є терміни, які я повинен спочатку визначити, оскільки ми будемо їх часто використовувати. Це члени та цінності.

  • Члени: це іменовані константи, які утворюють набір значень, що належать до переліку. Наприклад, перелік Days може містити такі члени: Sunday, Monday, Tuesday тощо.
  • Значення: це значення, які використовуються всередині для чіткого представлення кожного члена переліку. Це дасть можливість робити порівняння. Наприклад, у переліку Days неділя може мати значення 0, понеділок — 1, вівторок — 2 тощо.

Тепер ми обговоримо, як Enum покращує ваш код.

Як Enum покращує ваш код

Enum покращує ваш код і робить його більш читабельним і менш схильним до помилок. Нижче наведено кілька причин, чому вам варто їх використовувати.

  • Переліки дозволяють чітко визначити, які значення очікує змінна або аргумент функції. Зрозумілість ваших намірів за допомогою змінної або аргументу функції дозволить людям легко зрозуміти ваш код.
  • Enum також робить ваш код самодокументованим. Це означає, що вам не потрібно додавати коментарі чи документи, щоб указати, які значення очікує функція. Скоріше ваш перелік визначає, які значення очікуються.
  • Це також дозволяє IDE виділяти помилки, коли ви передаєте неправильні значення, і забезпечує підтримку автозавершення.
  • Як наслідок, ваш код стає безпечним для типів і менш імовірно, що вироблятиме помилки під час виконання.

Далі ми обговоримо, як створити Enum у Python.

Як створити Enum на Python

Python не має вбудованої підтримки переліків. Але він надає модуль enums у стандартній бібліотеці. Ми будемо використовувати цей модуль у цьому підручнику. У Python також є два методи створення переліків: класи або API функцій. Я розгляну обидва в цьому розділі.

передумови

Щоб слідувати цьому підручнику, вам потрібно встановити Python 3.4. Ця версія Python поставляється з модулем enum у стандартній бібліотеці. Якщо ви цього не зробили, ось посібник, який вам допоможе:

Щоб слідувати підручнику, вам потрібно трохи знати Python. Це включає базові концепції Python і більш просунуті концепції об’єктно-орієнтованого програмування, такі як класи та успадкування.

#1. Метод класу

Першим методом створення переліків є використання класів. Спочатку ви імпортуєте клас enum із модуля enum. Далі ви створюєте перелік, створюючи клас. Цей клас успадкує клас Enum, який ви імпортували раніше.

from enum import Enum

class Direction(Enum):
    NORTH = 0
    EAST = 1
    SOUTH = 2
    WEST = 3

Ви також можете призначити будь-які значення членам переліку. Ось приклад: замість того, щоб призначати 0, 1, 2 і 3 нашому переліку напрямків, ми призначаємо відповідні значення курсу 0, 90, 180 і 270.

from enum import Enum

class Direction(Enum):
    NORTH = 0
    EAST = 90
    SOUTH = 180
    WEST = 270

Крім того, використання функції діапазону є більш лаконічним способом генерації вищезазначеного. Наведений нижче фрагмент коду демонструє, як:

from enum import Enum

class Direction(Enum):
    NORTH, EAST, SOUTH, WEST = range(0, 360, 90)

У цьому випадку ми генеруємо значення за допомогою функції діапазону. Ми вказуємо 0 як початкове значення, 360 як кінцеве значення та 90 як значення збільшення. Ми деструктуруємо значення з ітерованого, подібно до того, як ми деструктуруємо кортежі. Якщо ви хочете прочитати більше про деструктуризацію кортежів, ось стаття про кортежі в Python.

Класи Enum є абстрактними класами. Це означає, що вони не призначені для створення екземплярів. Натомість доступ до їхніх властивостей, що представляють члени переліку в цьому випадку, здійснюється напряму.

#2. Метод функції

Метод функції є альтернативою методу підкласу.

from enum import Enum

Direction = Enum("Direction", ["NORTH", "EAST", "SOUTH", "WEST"])

У наведеному вище фрагменті коду ми створили перелік під назвою Direction. Він доступний за допомогою чотирьох членів, які ми надали як другий аргумент. За замовчуванням ці члени отримують значення від 1. Таким чином, Північ дорівнює 1, Схід – 2 і так далі. Це так, а не індекс від нуля, як очікувалося, тому що 0 є хибним. Отже, щоб усі значення були вірними, значення нумеруються від 1.

Крім того, ви можете призначити значення своїм членам, передавши їх як список кортежів. Кожен кортеж складається з двох елементів: імені члена та значення цього члена.

from enum import Enum

Direction = Enum(
    name = "Direction",
    values = [
        ("NORTH", "n"),
        ("EAST", "e"),
        ("SOUTH", "s"),
        ("WEST", "w"),
    ]
)

Ви також помітите, що я використовував рядки замість цілих чисел, коли призначав значення членам у наведеному вище прикладі. Це демонструє, що рядки є такими ж дійсними, як і цілі числа, коли призначаються значення.

Як використовувати Enum

У попередньому розділі ми розглянули створення переліків і призначення значень членам. У цьому розділі буде розглянуто використання переліків для доступу та призначення членів і перевірки рівності.

Як отримати доступ до учасників

Існує кілька методів доступу до елементів enum. До них відносяться синтаксис крапки, круглих дужок і синтаксис квадратних дужок. Ось приклад, щоб продемонструвати вищесказане:

from enum import Enum

# Creating an enum
class Day(Enum):
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY = range(1, 8)

# Accessing enum members
# 1. Using dot syntax
print(Day.SUNDAY)

# 2. Using square brackets
print(Day["MONDAY"])

# 3. Using the parentheses
print(Day(3))

Після доступу до члена enum ви можете зберегти його в змінній. Зауважте, що доступ до члена дає вам посилання на об’єкт-член, а не його значення чи назву. Це важливо пам’ятати в наступних кількох розділах.

Доступ до імені та значення

Як згадувалося раніше, коли ви отримуєте доступ до члена enum, ви створюєте посилання на об’єкт-член. Якщо ви з якоїсь причини хочете отримати доступ до назви або значення об’єкта enum, ви можете скористатися властивостями імені та значення об’єкта.

print(Day.SUNDAY.name, Day.SUNDAY.value)

Перевірка на рівність

Пам’ятайте, що призначення члена переліку змінній створює посилання на об’єкт члена переліку. Тому, щоб перевірити, чи має змінна певний член enum, ми використовуємо оператор is, щоб перевірити, чи член enum і змінна вказують на той самий об’єкт.

Ось приклад для демонстрації:

today = Day.WEDNESDAY

if today is Day.MONDAY:
    print("It's a Monday, :(")

if today is Day.WEDNESDAY:
    print("Happy Wednesday")

Крім того, ви можете використовувати оператор ==. У суперкласах класу Enum оператор == є оболонкою для оператора is. Це робиться за допомогою перевантаження оператора. Ви можете прочитати більше про це в цій статті про магічні методи. У будь-якому випадку, ось приклад, який використовує == замість is.

today = Day.WEDNESDAY

if today == Day.MONDAY:
    print("It's a Monday, :(")

if today == Day.WEDNESDAY:
    print("Happy Wednesday")

Ризикуючи повторюватися, порівняння enum перевіряють ідентичність об’єкта, а не значення.

Заключні слова

У цій статті описано, що таке enum і чому вони корисні. Ми також розглянули різні методи створення переліків за допомогою підкласу класу Enum і використання функціонального API.

Крім того, ми розглянули, як використовувати переліки, отримувати доступ до значень і робити порівняння. Далі ви можете прочитати нашу статтю про переліки TypeScript.