8

Стилизация многострочных условий в операторе 'if'? [закрыто]

7

Заголовок: Как лучше форматировать длинные условия в операторе 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 ответ(ов)

1

В вашем случае, где условия сводятся к простым логическим операциям AND и OR, вы можете использовать функции all() и any() для упрощения кода и повышения его читаемости. Вот как это можно сделать:

if all([cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4']):
    # Ваш код для случая, когда все условия истинны

if any([cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4']):
    # Ваш код для случая, когда хотя бы одно из условий истинно

Это позволяет сократить количество символов и делает очевидным, что в вашем условии нет никаких тонкостей. Таким образом, ваш код становится более лаконичным и понятным для чтения.

0

Когда у вас есть очень длинное условие в if, как в вашем примере, полезно форматировать его с помощью переноса на новую строку. Это не только улучшает читаемость кода, но и помогает избежать ошибок.

Вот как можно переписать ваш код, чтобы он был более понятным:

if (
    expr1
    and (expr2 or expr3)
    and hasattr(thingy1, '__eq__')
    or status == "HappyTimes"
):
    do_stuff()
else:
    do_other_stuff()

Такой стиль позволяет легче воспринять логику условия, поскольку каждое выражение размещается на отдельной строке. Не забудьте следить за приоритетом операций (как and, так и or), чтобы избежать неявных ошибок в логике. В некоторых случаях стоит рассмотреть возможность разбивки сложных условий на отдельные функции или переменные для улучшения читаемости.

0

Кто-то должен выступить за использование вертикального пространства в коде! 😃

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()

Да, мы жертвуем немного вертикального пространства ради ясности. Но, на мой взгляд, это стоит того.

0

Ваш код не сильно улучшает читаемость, но есть несколько способов сделать его более лаконичным и понятным. Например, вы можете использовать списки или кортежи для ваших условий. Вот один из способов:

conditions = [cond1 == 'val1', cond2 == 'val2', cond3 == 'val3', cond4 == 'val4']
allCondsAreOK = all(conditions)

if allCondsAreOK:
    do_something()

Таким образом, вы создаёте список, где каждое условие представлено как элемент. Используя функцию all(), вы проверяете, чтобы все условия были истинными. Это делает код более компактным и легко расширяемым, если вам нужно добавить больше условий в будущем.

0

Вот мое личное мнение: длинные условия, на мой взгляд, являются "запахом кода", который сигнализирует о необходимости рефакторинга в функцию/метод, возвращающий булевое значение. Например:

def is_action__required(...):
    return (cond1 == 'val1' and cond2 == 'val2'
            and cond3 == 'val3' and cond4 == 'val4')

Теперь, если бы я нашел способ сделать многострочные условия более эстетичными, я, вероятно, был бы доволен этим и пропустил бы рефакторинг.

С другой стороны, то, что они нарушают мое эстетическое восприятие, служит стимулом для рефакторинга.

Таким образом, мой вывод заключается в том, что многострочные условия должны выглядеть некрасиво, и это служит стимулом для их избегания.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь