Треки
/
Python
Python
/
Салабус
/
Переліки
Пе

Переліки у Python

1 вправа

Про концепцію Переліки

У Python перелік - це набір унікальних імен, яким відповідають унікальні константні значення. Enums визначаються шляхом успадкування класу Enum. Вбудовані типи переліків доступні в модулі enum, а клас Enum можна імпортувати за допомогою from enum import Enum.

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2

Зауважмо, що значеннями членів enum можуть бути будь-які типи даних, як-от str, tuple, float тощо.

class Color(Enum):
    RED = 'red'
    GREEN = 'green'

Enums також можна створити за допомогою синтаксису виклику функції.

from enum import Enum

Animal = Enum('Animal', 'ANT BEE CAT DOG')
list(Animal)
#=> [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]

Animal.ANT.value
#=> 1

Якщо присвоїти однакове значення двом членам enum, то член, присвоєний пізніше, стане псевдонімом першого. Використовувати однакове імʼя для двох різних членів enum не можна.

class Color(Enum):
    RED = 1
    GREEN = 2
    ALIAS_OF_RED = 1

Color.ALIAS_OF_RED
#=> <Color.RED: 1>

Перебрати члени переліку можна за допомогою стандартного синтаксису for member in:

for member in Color:
    print((member.name, member.value))
#=> (RED, 1)
#=> (GREEN, 2)

# __members__.items() helps you to loop through alias as well
for member in Color.__members__.items():
    print(member)
#=> ('RED', <Color.RED: 1>)
#=> ('GREEN', <Color.GREEN: 2>)
#=> ('ALIAS_OF_RED', <Color.RED: 1>)

Члени Enum можна порівнювати за допомогою is (оператор ідентичності) або is not. == і != (оператори рівності) працюють так само:

a = Color.RED

a is Color.RED
#=> True

a == Color.RED
#=> True

Щоб присвоювати цілі значення, функція auto() починає з 1 і автоматично задає наступні значення.

class Shape(Enum):
    CIRCLE = auto()
    SQUARE = auto()
    OVAL = auto()

Щоб заборонити псевдоніми (запобігти дублюванню значень під різними іменами), можна скористатися декоратором класу @enum.unique.

@enum.unique
class Shape(Enum):
    CIRCLE = 1
    SQUARE = 2
    TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE

Щоб отримати член enum за заданим значенням, можна скористатися таким записом: <EnumName>(<value>).

g = Color(2)

g is Color.GREEN
#=> True

g
#=> <Color.GREEN: 2>

Власний обмежений Enum можна написати, успадкувавши клас Enum разом із будь-яким міксином або типом даних. Наприклад:

class StrEnum(str, Enum):
    pass

Успадковувати Enum можна лише тоді, коли enum не визначає жодного члена. Докладніше дивіться в посібнику з enum та в книзі рецептів enum.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці