Как выйти из предложения 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 60

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

вообще говоря, нет. Если вы гнездования "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()

обратите внимание, что функции не должны быть объявлены в операторе 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