Приоритет операторов: & и == в Python
@python_quizРазберем этот квиз
Короткий фрагмент кода:

Что он выведет и почему?
Быстрый ответ
Код выведет:

Пошаговый разбор выражения
Выражение в условии тернарного оператора — это:

Важно: в Python оператор сравнения (==) имеет более высокий приоритет, чем побитовый оператор &. Поэтому выражение парсится как:

Дальше:
mask == mask— это булево выражение, дающееTrue.- В Python
bool— подклассint, иTrueведёт себя как1. - Выполняется побитовое И:
flags & True→0b0010 & 0b0001→0b0000→0. - В тернарном операторе
0интерпретируется как ложь, поэтому печатается'NOT SET'.
Демонстрация в коде

Анализ вариантов ответов (коротко)
- "Выведет: SET" — логично, если думать, что выражение парсится как
(flags & mask) == mask. Однако без скобок это не так. - "Выведет: NOT SET" — это фактический результат из-за приоритета
==над&. - "Будет исключение
TypeError" — не возникнет, потому что побитовый&сboolдопустим (True→1). - "Ничего не выведет" — неверно:
printвсегда что-то выведет.
Как писать безопасно и читабельно
Чтобы избежать таких сюрпризов, всегда ставьте скобки, когда проверяете битовые маски:

Это однозначно и читаемо.
Вывод
При работе с битовыми операциями будьте внимательны к приоритету операторов. Для проверок масок всегда используйте явные скобки — это предотвращает логические ошибок и делает код понятнее для коллег (и для вас самих через месяц).