Как выйти из выражения if

Из чего виды методов существуют для того, чтобы преждевременно выйти if пункт?

Существуют времена, когда я пишу код и хочу поместить a break оператор в if пункт, только чтобы помнить, что они могут только использоваться для циклов.

Позволяет берут следующий код в качестве примера:

if some_condition:
   ...
   if condition_a:
       # do something
       # and then exit the outer if block
   ...
   if condition_b:
       # do something
       # and then exit the outer if block
   # more code here

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

if some_condition:
   ...
   if condition_a:
       # do something
       # and then exit the outer if block
   else:
       ...
       if condition_b:
           # do something
           # and then exit the outer if block
       else:
           # more code here

Проблема с этим состоит в том, что больше местоположений выхода означает больше вложенного/с отступом кода.

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

Делает любой знает о хорошем/лучше способе выйти if пункт?

Если еще существует кто-либо связанный - если бы и выражения else, я полагаю, что выход перескочил бы через них.

87
задан Roman 15 January 2010 в 05:20
поделиться

7 ответов

(этот метод работает для , если , несколько вложенных петель и другие конструкции, которые вы не можете откровенно .) .)

код в своей собственной функции. Вместо разрыва , используйте возврат .

Пример:

def some_function():
    if condition_a:
        # do something and return early
        ...
        return
    ...
    if condition_b:
        # do something else and return early
        ...
        return
    ...
    return

if outer_condition:
    ...
    some_function()
    ...
86
ответ дан 24 November 2019 в 07:47
поделиться

Вообще говоря, не. Если вы устанавливаете «IFS» и ломаете от них, вы делаете это неправильно.

Однако, если вы должны:

if condition_a:
   def condition_a_fun():
       do_stuff()
       if we_wanna_escape:
           return
   condition_a_fun()
if condition_b:
   def condition_b_fun():
       do_more_stuff()
       if we_wanna_get_out_again:
           return
   condition_b_fun()

Примечание, функции не должны быть объявлены в заявлении, если они могут быть объявлены заранее;) Это будет лучший выбор, поскольку он избегает нуждающегося в рефакторе уродливый, если / потом позже.

4
ответ дан 24 November 2019 в 07:47
поделиться

Вы можете эмулировать функциональность GoTo с исключениями:

try:
    # blah, blah ...
    # raise MyFunkyException as soon as you want out
except MyFunkyException:
    pass

Отказ от ответственности: Я хочу привлечь к вашему вниманию возможности этого способа делать то, что ни в коем случае я не могу одобрить это как разумно под нормально обстоятельства. Как я уже говорил в комментарии к вопросу, структурирующий код, чтобы избежать византийских условных условий, в первую очередь предпочтительнее. : -)

10
ответ дан 24 November 2019 в 07:47
поделиться
while some_condition:
   ...
   if condition_a:
       # do something
       break
   ...
   if condition_b:
       # do something
       break
   # more code here
   break
20
ответ дан 24 November 2019 в 07:47
поделиться

Может быть это?

if some_condition and condition_a:
       # do something
elif some_condition and condition_b:
           # do something
           # and then exit the outer if block
elif some_condition and not condition_b:
           # more code here
else:
     #blah
if
-121--842314-

Эффективно то, что вы описываете, это операторы goto, которые, как правило, планируются довольно сильно. Ваш второй пример гораздо легче понять.

Однако уборщик все равно будет:

if some_condition:
   ...
   if condition_a:
       your_function1()
   else:
       your_function2()

...

def your_function2():
   if condition_b:
       # do something
       # and then exit the outer if block
   else:
       # more code here
-121--842317-
from goto import goto, label

if some_condition:
   ...
   if condition_a:
       # do something
       # and then exit the outer if block
       goto .end
   ...
   if condition_b:
       # do something
       # and then exit the outer if block
       goto .end
   # more code here

label .end

(Не используйте это, пожалуйста)

44
ответ дан 24 November 2019 в 07:47
поделиться

Может быть, это?

if some_condition and condition_a:
       # do something
elif some_condition and condition_b:
           # do something
           # and then exit the outer if block
elif some_condition and not condition_b:
           # more code here
else:
     #blah
if
5
ответ дан 24 November 2019 в 07:47
поделиться

Эффективно то, что вы описываете, - это операторы GOTO, которые, как правило, довольно сильно выступают. Ваш второй пример гораздо проще понять.

Однако уборщик все еще будет:

if some_condition:
   ...
   if condition_a:
       your_function1()
   else:
       your_function2()

...

def your_function2():
   if condition_b:
       # do something
       # and then exit the outer if block
   else:
       # more code here
1
ответ дан 24 November 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: