Здесь происходит несколько вещей:
В качестве значения ветвления для if
вы используете кортеж.Достоверность предиката указывает только, является ли он пустым или нет, и ничего о его содержимом:
assert bool(tuple()) is False
assert bool((False, )) is True
Во-вторых, если вы заранее знаете количество элементов в кортеже, используя or
s и and
s обычно более читабелен, как вы упомянули:
if is_dog or is_cat:
do_something()
И, наконец, вы можете использовать any
для произвольного числа значений:
values = [is_dog, is_cat, ... more]
if any(values):
do_something()