Как Enums в Python подобряват четимостта на кода

Enums са популярен тип данни в езиците за програмиране като C, C++ и Java. Те ви помагат да пишете безопасен и по-четим код.

В Python enum-ите не винаги се поддържаха. От версия 3.4 обаче Python вече поддържа enums. Тази статия е ръководство за това как да създавате enums, как да ги използвате и как подобряват четливостта на кода.

Какво представляват енумите и какво правят?

Enum или enumeration е тип данни, дефиниран от набора от стойности, които може да приеме. Този набор от стойности се нарича негов набор от членове. Енумите ви позволяват да дефинирате по-тясно стойностите, които една променлива може да има. Това ви помага да пишете безопасен код. Освен това подобрява четливостта.

Някои условия, които трябва да знаете

Докато обсъждаме енуми, има термини, които първо трябва да дефинирам, тъй като ще ги използваме често. Това са членове и ценности.

  • Членове: Това са наименуваните константи, които формират набора от стойности, принадлежащи на enum. Например преброяването Days може да съдържа следните членове: Sunday, Monday, Tuesday и т.н.
  • Стойности: Това са стойностите, използвани вътрешно за ясно представяне на всеки член на enum. Това ще позволи да се правят сравнения. Например в списъка Days неделя може да има стойност 0, понеделник стойност 1, вторник стойност 2 и т.н.

Сега ще обсъдим как Enum подобряват вашия код.

Как Enums подобряват вашия код

Enum подобряват вашия код и го правят по-четлив и по-малко податлив на грешки. По-долу са някои от причините, поради които трябва да ги използвате:

  • Енумите ви позволяват да дефинирате ясно какви стойности очаква променлива или аргумент на функция. Изясняването на вашите намерения с променлива или функционален аргумент позволява на хората да разберат вашия код с лекота.
  • Enums също правят вашия код самодокументиращ се. Това означава, че не е нужно да добавяте коментари или документи, за да посочите какви стойности очаква дадена функция. По-скоро вашият enum указва какви стойности се очакват.
  • Това също така позволява на IDE да маркира грешки, когато подадете неправилни стойности и да осигури поддръжка за автоматично довършване.
  • В резултат на това вашият код става безопасен за типове и е по-малко вероятно да генерира грешки по време на изпълнение.
  Samsung Galaxy S20: Включване на жестове и промяна на реда на бутоните в лентата за навигация

След това ще обсъдим как да създадем Enum в Python.

Как да създадете Enum в Python

Python няма собствена поддръжка за enum. Но предоставя модул enums в стандартната библиотека. Ще използваме този модул в този урок. Има и два метода за създаване на enum в Python: Classes или Function API. Ще разгледам и двете в този раздел.

Предпоставки

За да следвате този урок, трябва да имате инсталиран Python 3.4. Тази версия на Python идва с модула enum в стандартната библиотека. Ако не сте го направили, ето урок, който да ви помогне:

За да следвате урока, ще трябва да знаете малко Python. Това включва основен Python и по-усъвършенствани концепции за обектно-ориентирано програмиране като класове и наследяване.

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

Първият метод за създаване на enum е използването на класове. Първо импортирате класа enum от модула enum. След това създавате своето enum, като създавате клас. Този клас ще наследи класа Enum, който сте импортирали по-рано.

from enum import Enum

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

Можете също така да присвоите каквито искате стойности на членовете на enum. Ето един пример: вместо да присвояваме 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 са абстрактни класове. Това означава, че те не са предназначени да бъдат инстанцирани. Вместо това техните свойства, представляващи членовете на enum в този случай, са достъпни директно.

#2. Функционалният метод

Функционалният метод е алтернатива на метода за подкласиране.

from enum import Enum

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

В горния кодов фрагмент създадохме enum, наречен Direction. Той е достъпен с помощта на четири члена, които предоставихме като втори аргумент. По подразбиране на тези членове се дават стойности от 1. Така че север е 1, изток е 2 и т.н. Това е случаят, а не базиран на нула индекс, както се очаква, защото 0 е невярно. Така че, за да бъдат всички стойности верни, стойностите са номерирани от 1.

Като алтернатива можете да присвоите стойности на вашите членове, като подадете членовете като списък от кортежи. Всеки кортеж се състои от два елемента: името на члена и стойността на този член.

from enum import Enum

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

Ще забележите също, че използвах низове вместо цели числа, когато присвоявах стойности на членовете в горния пример. Това демонстрира, че низовете са толкова валидни, колкото и целите числа при присвояване на стойности.

Как да използвате Enums

В предишния раздел разгледахме създаването на изброения и присвояването на стойности на членовете. Този раздел ще обхване използването на enum за достъп и присвояване на членове и проверка за равенство.

  Как да проверите дали дадено устройство е USB 3.0 или USB 2.0

Как да получите достъп до членове

Има множество методи за достъп до членове на 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 към променлива създава препратка към обекта член enum. Следователно, за да проверим дали дадена променлива има определен член 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 чрез подкласиране на клас Enum и използване на функционалния API.

Освен това разгледахме как да използваме enums, да получаваме достъп до стойности и да правим сравнения. След това може да искате да прочетете нашата статия за енумите на TypeScript.