Использование кортежей bools для операторов if - PullRequest
0 голосов
/ 07 апреля 2019

Я хотел бы знать, является ли хорошей практикой использование кортежей вместо разделенных выражений в операторе if.

is_dog = True
is_brown = False

Я хотел бы сделать так:

if (is_dog, is_brown):
    do_something()

Вместо этого:

if is_dog or is_brown:
    do_something()

Какова наилучшая практика в этом случае? Спасибо

Ответы [ 2 ]

4 голосов
/ 07 апреля 2019

Здесь происходит несколько вещей:

В качестве значения ветвления для 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()
3 голосов
/ 07 апреля 2019

Это , а не хорошая практика, чтобы увидеть, является ли либо bool True:

if (False,False):
    print("it does not do what you think it does")

Выход:

it does not do what you think it does

См. проверка значения истинности Python : любой непустой кортеж True -thy

Правильный путь:

if a or b:   
    pass

Для кратных можно использовать any():

if any(x for x in (False, True)):
    pass   # will enter here if any part of the tuple is True
else:
    pass   # will enter here if no part of the tuple is True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...