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 — локальная установка не требуется.
Все уроки этого курса
- Класс Enum
- IntEnum и Flag
- Основы NamedTuple
- typing.NamedTuple