Стилизировать многострочные условия в операторах if? - PullRequest
569 голосов
/ 08 октября 2008

Иногда я разбиваю длинные условия в 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

Но это не очень красиво. : -)

Можете ли вы порекомендовать альтернативный способ?

Ответы [ 29 ]

1 голос
/ 17 июня 2017

Все респонденты, которые также предоставляют мультиусловия для утверждения if, столь же ужасны, как и представленная проблема Вы не решаете эту проблему, делая то же самое ..

Даже ответ PEP 0008 отталкивающий.

Вот гораздо более читабельный подход

condition = random.randint(0, 100) # to demonstrate
anti_conditions = [42, 67, 12]
if condition not in anti_conditions:
    pass

Хочешь, чтобы я съел мои слова? Убедите меня, что вам нужны мультиусловия, и я буквально напечатаю это и съест это для вашего развлечения.

1 голос
/ 03 декабря 2014

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

if bool(condition1 and
        condition2 and
        ...
        conditionN):
    foo()
    bar()

В этом решении я нахожу несколько достоинств по сравнению с другими, которые я видел, а именно: вы получаете ровно дополнительные 4 пробела отступа (bool), позволяя всем условиям выстраиваться вертикально, а тело оператора if может быть отступом в ясной (ish) форме. Это также сохраняет преимущества оценки коротких замыканий логических операторов, но, конечно, добавляет накладные расходы при вызове функции, которая в основном ничего не делает. Вы могли бы утверждать (действительно), что любая функция, возвращающая свой аргумент, могла бы использоваться здесь вместо bool, но, как я уже сказал, это всего лишь идея, и в конечном итоге это вопрос вкуса.

Как ни странно, когда я писал это и думал о «проблеме», у меня появилась еще одна идея , которая устраняет накладные расходы при вызове функции. Почему бы не указать, что мы собираемся ввести сложное условие, используя дополнительные пары скобок? Скажем, еще 2, чтобы получить хороший 2 пробела для подусловий относительно тела оператора if. Пример:

if (((foo and
      bar and
      frob and
      ninja_bear))):
    do_stuff()

Мне отчасти это нравится, потому что, когда вы смотрите на это, в вашей голове сразу же звонит колокол, говорящий "эй, здесь происходит сложная вещь!" . Да, я знаю, что круглые скобки не помогают читабельности, но эти условия должны появляться достаточно редко, и когда они все-таки появятся, вам придется все равно остановиться и прочитать их осторожно (потому что они сложные ).

Во всяком случае, еще два предложения, которые я не видел здесь. Надеюсь, это кому-нибудь поможет:)

1 голос
/ 04 августа 2016

Вы можете разбить его на две строки

total = cond1 == 'val' and cond2 == 'val2' and cond3 == 'val3' and cond4 == val4
if total:
    do_something()

Или даже добавить одно условие за раз. Таким образом, по крайней мере, это отделяет беспорядок от if.

0 голосов
/ 22 сентября 2011

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

if (cond1 == 'val1' and cond2 == 'val2' and
    cond3 == 'val3' and cond4 == 'val4'):
        do_something
0 голосов
/ 06 декабря 2015

если наше условие if & else должно выполнить несколько операторов внутри него, мы можем написать, как показано ниже. Каждый раз, когда у нас есть, если еще пример с одним утверждением внутри него.

Спасибо, это работает для меня.

#!/usr/bin/python
import sys
numberOfArgument =len(sys.argv)
weblogic_username =''
weblogic_password = ''
weblogic_admin_server_host =''
weblogic_admin_server_port =''


if numberOfArgument == 5:
        weblogic_username = sys.argv[1]
        weblogic_password = sys.argv[2]
        weblogic_admin_server_host =sys.argv[3]
        weblogic_admin_server_port=sys.argv[4]
elif numberOfArgument <5:
        print " weblogic UserName, weblogic Password and weblogic host details are Mandatory like, defalutUser, passwordForDefaultUser, t3s://server.domainname:7001 ."
        weblogic_username = raw_input("Enter Weblogic user Name")
        weblogic_password = raw_input('Enter Weblogic user Password')
        weblogic_admin_server_host = raw_input('Enter Weblogic admin host ')
        weblogic_admin_server_port = raw_input('Enter Weblogic admin port')
#enfelif
#endIf
0 голосов
/ 09 июня 2010

Соберите свои условия в список, затем сделайте что-нибудь. как:

if False not in Conditions:
    do_something
0 голосов
/ 05 марта 2015

Я обычно использую:

if ((cond1 == 'val1' and cond2 == 'val2' and
     cond3 == 'val3' and cond4 == 'val4')):
    do_something()
0 голосов
/ 13 марта 2012
  if cond1 == 'val1' and \
     cond2 == 'val2' and \
     cond3 == 'val3' and \
     cond4 == 'val4':
      do_something

или, если это яснее:

  if cond1 == 'val1'\
     and cond2 == 'val2'\
     and cond3 == 'val3'\
     and cond4 == 'val4':
      do_something

Нет причины, по которой отступ должен быть кратен 4, например, см. «Выровнен по открывающему разделителю»:

http://google -styleguide.googlecode.com / SVN / багажник / pyguide.html? Showone = Отступ # отступов

0 голосов
/ 17 октября 2014

Вот еще один подход:

cond_list = ['cond1 == "val1"','cond2=="val2"','cond3=="val3"','cond4=="val4"']
if all([eval(i) for i in cond_list]):
 do something

Это также позволяет легко добавить другое условие без изменения оператора if, просто добавив другое условие в список:

cond_list.append('cond5=="val5"')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...