Не только логические операнды
В Python and и or используют истинность значений, но возвращают один из самих операндов. Для a or b результатом становится a, если он истинен, иначе b. Для a and b — a, если он ложен, иначе b.
Упражнение источника
Выполните три выражения и сравните значения и типы:
print("" or 0) # 0
print(0 and True) # 0
print(bool(0 and True)) # False
В первой строке пустая строка ложна, поэтому возвращается второй операнд — целое 0. Во второй строке первый операнд уже ложный, поэтому возвращается тот же 0. В третьей bool явно переводит результат в логический тип.
Короткое замыкание
Если результат определился на первой части, вторая не вычисляется. Например, False and (1 / 0) возвращает False без деления на ноль. Но True and (1 / 0) уже выполняет деление и вызывает ошибку.
Это свойство можно использовать для защиты доступа к данным, однако условие защиты должно действительно покрывать все опасные случаи.
Истинность значений
Нули, None и пустые встроенные коллекции обычно ложны, непустые строки истинны — в том числе "0" и "False". Список ложных значений не ограничен несколькими литералами: пользовательские классы тоже могут определять своё поведение через специальные методы.
Значение по умолчанию
Конструкция name or "Anonymous" удобна, если нужно заменить любое ложное name. Но она также заменит пустую строку, а не только None. Если пустая строка является допустимым отдельным значением, проверять следует нужное условие явно, например name is None.
Hexlet / Code Basics и участники · Исходный урок и решение · GNU AGPL v3. Выражения сохранены; истинность и короткое замыкание уточнены.