and и пустой dict в Python
@python_quizРазберем этот квиз
Короткий разбор кода и объяснение — почему вызов печатает именно то, что печатает.
Условие (фрагмент кода)

Вопрос: что напечатает этот код и почему?
Ключевая идея — как работает логический оператор and в Python
Важно помнить две вещи:
- Пустые контейнеры (например, {}, [], "", set()) считаются ложными (falsy).
- Логические операторы в Python (and, or) не обязательно возвращают булевы значения True/False. Они возвращают один из операндов:
- a and b возвращает a, если a ложен; иначе возвращает b.
- a or b возвращает a, если a истинен; иначе возвращает b.
Применим это к выражению user and user.get('is_admin'):
- Сначала вычисляется user.
- Если user ложен (например, {} или None), выражение сразу возвращает этот user.
- Если user истинен (непустой dict), возвращается результат user.get('is_admin').
Почему print(check({})) печатает {}
Поскольку передан пустой словарь {}, он ложен. Поэтому выражение user and user.get('is_admin') возвращает сам первый (ложный) операнд — {}. Функция возвращает {}, а print выводит его в таком виде.
Демонстрация: примеры

Также наглядные примеры поведения and вне функции:

Частые ошибки и замечания
- Ожидание, что логические операторы всегда возвращают True/False — неверно в Python.
- При использовании конструкции вида user and user.get(...) для проверки поля учитывайте, что если user — пустой контейнер, вы получите сам контейнер, а не булево значение. Если вам нужно булево значение, явно приведите к bool: bool(user and user.get('is_admin')).
- Если хочется возвращать False вместо None или пустого контейнера в таких случаях, можно использовать выражение вроде:
`python
return bool(user) and bool(user.get('is_admin'))
`
или
`python
return (user and user.get('is_admin')) or False
`
Вывод
Пустые контейнеры в Python ложны, а оператор and возвращает первый ложный операнд или второй (если первый истинен). В данном коде при передаче {} результатом выражения становится сам {}, поэтому на экран попадает {}.