0Pricing
Python Academy · Урок

IntEnum и Flag

Используйте перечисления целых чисел и флагов

«IntEnum и Flag» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.

За пределами обычного Enum

Модуль enum содержит специализированные базовые классы. Элементы IntEnum ведут себя как целые числа, а элементы Flag можно объединять с помощью побитовых операторов. Они подходят для случаев, когда обычный Enum слишком ограничен.

Обычный Enum — не int

Элемент обычного Enum нельзя взаимозаменяемо использовать с его целочисленным значением. При сравнении с числом возвращается False.

from enum import Enum

class Level(Enum):
    LOW = 1
    HIGH = 2

print(Level.LOW == 1)

IntEnum сравнивается как int

Элемент IntEnum является целым числом, поэтому он равен своему числовому значению при сравнении и поддерживает упорядочивание.

from enum import IntEnum

class Level(IntEnum):
    LOW = 1
    HIGH = 2

print(Level.LOW == 1)
print(Level.LOW < Level.HIGH)

IntEnum в арифметике

Поскольку элементы являются настоящими целыми числами, их можно использовать в математических операциях и при индексировании. Это пригодится, когда значение действительно должно взаимодействовать с числовым кодом.

from enum import IntEnum

class Priority(IntEnum):
    LOW = 1
    MEDIUM = 5
    HIGH = 10

print(Priority.HIGH + 1)
print(Priority.MEDIUM * 2)

Сортировка элементов IntEnum

Поскольку IntEnum поддерживает упорядочивание, список элементов сортируется по значениям без дополнительной функции ключа.

from enum import IntEnum

class Priority(IntEnum):
    LOW = 1
    MEDIUM = 5
    HIGH = 10

for p in sorted([Priority.HIGH, Priority.LOW, Priority.MEDIUM]):
    print(p.name)

Flag для комбинируемых параметров

Перечисление Flag предназначено для значений, которые объединяются. Присваивайте степени двойки, чтобы каждый элемент занимал свой бит.

from enum import Flag, auto

class Permission(Flag):
    READ = auto()
    WRITE = auto()
    EXECUTE = auto()

print(Permission.READ)
print(Permission.READ.value)

Объединение Flag с помощью |

Используйте побитовый оператор OR |, чтобы объединить флаги в одно составное значение.

from enum import Flag, auto

class Permission(Flag):
    READ = auto()
    WRITE = auto()
    EXECUTE = auto()

access = Permission.READ | Permission.WRITE
print(access)

Проверка вхождения с помощью in

Проверяйте, установлен ли флаг, с помощью оператора in, который выполнит побитовую проверку за вас.

from enum import Flag, auto

class Permission(Flag):
    READ = auto()
    WRITE = auto()
    EXECUTE = auto()

access = Permission.READ | Permission.WRITE
print(Permission.READ in access)
print(Permission.EXECUTE in access)

Пересечение и удаление

Объединяйте флаги с помощью & (AND), чтобы найти общие биты, а для удаления флага применяйте & к дополнению ~.

from enum import Flag, auto

class Permission(Flag):
    READ = auto()
    WRITE = auto()
    EXECUTE = auto()

access = Permission.READ | Permission.WRITE
still = access & ~Permission.WRITE
print(still)

IntFlag для целочисленных флагов

IntFlag объединяет обе идеи: это комбинируемые флаги, которые также ведут себя как обычные целые числа. Они удобны при взаимодействии с интерфейсами C или битовыми масками, хранящимися в виде чисел.

from enum import IntFlag, auto

class Mode(IntFlag):
    R = 4
    W = 2
    X = 1

m = Mode.R | Mode.W
print(int(m))

Перебор объединённого Flag

Перебор объединённого значения Flag возвращает каждый отдельный содержащийся в нём флаг, что удобно для вывода активных параметров.

from enum import Flag, auto

class Permission(Flag):
    READ = auto()
    WRITE = auto()
    EXECUTE = auto()

access = Permission.READ | Permission.EXECUTE
for p in access:
    print(p.name)

Быстрая проверка

Почему стоит выбрать перечисление Flag, а не обычный Enum?

Повторение

Вы изучили целочисленные перечисления и перечисления флагов.

  • Элементы IntEnum ведут себя как целые числа и поддерживают упорядочивание и арифметические операции.
  • Элементы Flag объединяются с помощью |, & и ~, а их наличие проверяется с помощью in.
  • IntFlag сочетает оба поведения.
  • Для значений флагов используйте степени двойки.

Часто задаваемые вопросы

Урок «IntEnum и Flag» бесплатный?

Да — полный текст урока «IntEnum и Flag» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.

Чему я научусь в уроке «IntEnum и Flag»?

Используйте перечисления целых чисел и флагов Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Python Academy?

Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «IntEnum и Flag»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Python Academy?

Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Класс Enum
  2. IntEnum и Flag
  3. Основы NamedTuple
  4. typing.NamedTuple
← Назад к Python Academy