Как выйти из предложения if

какие существуют методы для преждевременного выхода из if предложения?

бывают моменты, когда я пишу код и хочу поставить 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, оберните оставшийся код в большой блок else. Пример:

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-if и else, я полагаю, что выход пропустит их.

9 ответов


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

оберните код в свою функцию. Вместо break используйте return.

пример:

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

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

(на самом деле не использовать это, пожалуйста.)


while some_condition:
   ...
   if condition_a:
       # do something
       break
   ...
   if condition_b:
       # do something
       break
   # more code here
   break

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

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

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


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

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

вообще говоря, нет. Если вы гнездитесь в "если" и отрываетесь от них, вы делаете это неправильно.

однако, если необходимо:

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

обратите внимание, что функции не должны быть объявлены в операторе if, они могут быть объявлены заранее ;) это было бы лучшим выбором, так как это позволит избежать необходимости рефакторинга уродливого if/then позже.


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

while (True):
    if (some_condition):
        ...
        if (condition_a):
            # do something
            # and then exit the outer if block
            break
        ...
        if (condition_b):
            # do something
            # and then exit the outer if block
            break
        # more code here
    # make sure it is looped once
    break

эффективно то, что вы описываете, - это операторы 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

Итак, здесь я понимаю, что вы пытаетесь вырваться из внешнего Если блок кода

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, который затем неявно выйдет из блока кода, затем вы используете блок else для вложения другого ifs в сделать что-то

if test_for_false:
    # Exit the code(which is the outer if code)

else:
    if condition_a:
        # Do something

    if condition_b:
        # Do something