and и пустой dict в Python

and и пустой dict в Python

@python_quiz

Разберем этот квиз

Короткий разбор кода и объяснение — почему вызов печатает именно то, что печатает.

Условие (фрагмент кода)

python

Вопрос: что напечатает этот код и почему?

Ключевая идея — как работает логический оператор 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 выводит его в таком виде.

Демонстрация: примеры

python

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

python

Частые ошибки и замечания

  • Ожидание, что логические операторы всегда возвращают 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 возвращает первый ложный операнд или второй (если первый истинен). В данном коде при передаче {} результатом выражения становится сам {}, поэтому на экран попадает {}.

Report Page