Ответ 1
and
никогда не прибегает к bool. Скорее, if
вызывает bool()
результат выражения.
Выражение с использованием and
(и or
, если на то пошло), коротких замыканий, когда оно может определить, что выражение не будет оцениваться как True или False на основе первого операнда и возвращает последнее оцениваемое значение:
>>> 0 and 'string'
0
>>> 1 and 'string'
'string'
>>> 'string' or 10
'string'
>>> '' or 10
10
Этот "побочный эффект" часто используется в коде python. Обратите внимание, что not
возвращает логическое значение. Подробнее см. документацию python для логических операторов.
В документации также объясняется, что представляет собой эквивалент True
или False
для разных типов, например None
, 0
, ''
и пустые контейнеры составляют False
, тогда как большинство остальных эквивалентно True
.
Для пользовательских классов вам необходимо определить метод .__nonzero__()
(возвращает True
или False
) или .__len__()
method (возвращает int, где 0
- False
, а все остальное - True
), чтобы влиять на их булевский эквивалент, в противном случае они всегда будут по умолчанию True
.