Стилизация многострочных условий в операторе 'if'? [закрыто]
Заголовок: Как лучше форматировать длинные условия в операторе if в Python?
Здравствуйте!
Иногда я разбиваю длинные условия в операторе if
на несколько строк. Наиболее очевидный способ сделать это:
if (cond1 == 'val1' and cond2 == 'val2' and
cond3 == 'val3' and cond4 == 'val4'):
do_something
Однако такой подход визуально выглядит не очень привлекательно, так как действие сливается с условиями. Тем не менее, это естественный способ с использованием правильного отступа в Python — 4 пробела.
На данный момент я использую следующий подход:
if ( cond1 == 'val1' and cond2 == 'val2' and
cond3 == 'val3' and cond4 == 'val4'):
do_something
Но и этот способ не очень красив 😃.
Не могли бы вы порекомендовать альтернативный способ форматирования длинных условий в операторе if
?
Заранее спасибо!
5 ответ(ов)
В вашем случае, где условия сводятся к простым логическим операциям AND и OR, вы можете использовать функции all()
и any()
для упрощения кода и повышения его читаемости. Вот как это можно сделать:
if all([cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4']):
# Ваш код для случая, когда все условия истинны
if any([cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4']):
# Ваш код для случая, когда хотя бы одно из условий истинно
Это позволяет сократить количество символов и делает очевидным, что в вашем условии нет никаких тонкостей. Таким образом, ваш код становится более лаконичным и понятным для чтения.
Когда у вас есть очень длинное условие в if
, как в вашем примере, полезно форматировать его с помощью переноса на новую строку. Это не только улучшает читаемость кода, но и помогает избежать ошибок.
Вот как можно переписать ваш код, чтобы он был более понятным:
if (
expr1
and (expr2 or expr3)
and hasattr(thingy1, '__eq__')
or status == "HappyTimes"
):
do_stuff()
else:
do_other_stuff()
Такой стиль позволяет легче воспринять логику условия, поскольку каждое выражение размещается на отдельной строке. Не забудьте следить за приоритетом операций (как and
, так и or
), чтобы избежать неявных ошибок в логике. В некоторых случаях стоит рассмотреть возможность разбивки сложных условий на отдельные функции или переменные для улучшения читаемости.
Кто-то должен выступить за использование вертикального пространства в коде! 😃
if ( cond1 == val1
and cond2 == val2
and cond3 == val3
):
do_stuff()
Это делает каждое условие четко видимым. Также это позволяет более наглядно выражать более сложные условия:
if ( cond1 == val1
or
( cond2_1 == val2_1
and cond2_2 >= val2_2
and cond2_3 != bad2_3
)
):
do_more_stuff()
Да, мы жертвуем немного вертикального пространства ради ясности. Но, на мой взгляд, это стоит того.
Ваш код не сильно улучшает читаемость, но есть несколько способов сделать его более лаконичным и понятным. Например, вы можете использовать списки или кортежи для ваших условий. Вот один из способов:
conditions = [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4']
allCondsAreOK = all(conditions)
if allCondsAreOK:
do_something()
Таким образом, вы создаёте список, где каждое условие представлено как элемент. Используя функцию all()
, вы проверяете, чтобы все условия были истинными. Это делает код более компактным и легко расширяемым, если вам нужно добавить больше условий в будущем.
Вот мое личное мнение: длинные условия, на мой взгляд, являются "запахом кода", который сигнализирует о необходимости рефакторинга в функцию/метод, возвращающий булевое значение. Например:
def is_action__required(...):
return (cond1 == 'val1' and cond2 == 'val2'
and cond3 == 'val3' and cond4 == 'val4')
Теперь, если бы я нашел способ сделать многострочные условия более эстетичными, я, вероятно, был бы доволен этим и пропустил бы рефакторинг.
С другой стороны, то, что они нарушают мое эстетическое восприятие, служит стимулом для рефакторинга.
Таким образом, мой вывод заключается в том, что многострочные условия должны выглядеть некрасиво, и это служит стимулом для их избегания.
Однострочное выражение if-then-else
Почему используется string.join(list), а не list.join(string)?
Создание словаря с помощью генератора словарей
Как получить полный путь к директории текущего файла?
Найти все файлы с расширением .txt в директории на Python