How to exit an if clause

前端 未结 13 1720
故里飘歌
故里飘歌 2020-12-04 08:45

What sorts of methods exist for prematurely exiting an if clause?

There are times when I\'m writing code and want to put a break statement

相关标签:
13条回答
  • 2020-12-04 08:47

    (This method works for ifs, multiple nested loops and other constructs that you can't break from easily.)

    Wrap the code in its own function. Instead of break, use return.

    Example:

    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()
        ...
    
    0 讨论(0)
  • 2020-12-04 08:47

    You can emulate goto's functionality with exceptions:

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

    Disclaimer: I only mean to bring to your attention the possibility of doing things this way, while in no way do I endorse it as reasonable under normal circumstances. As I mentioned in a comment on the question, structuring code so as to avoid Byzantine conditionals in the first place is preferable by far. :-)

    0 讨论(0)
  • 2020-12-04 08:47

    Effectively what you're describing are goto statements, which are generally panned pretty heavily. Your second example is far easier to understand.

    However, cleaner still would be:

    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
    
    0 讨论(0)
  • 2020-12-04 08:49
    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
    

    (Don't actually use this, please.)

    0 讨论(0)
  • 2020-12-04 08:53

    Here's another way to handle this. It uses a single item for loop that enables you to just use continue. It prevents the unnecessary need to have extra functions for no reason. And additionally eliminates potential infinite while loops.

    if something:
        for _ in [0]:
            # Get x
            if not x:
                continue
    
            # Get y
            if not y:
                continue
    
            # Get z
            if not z:
                continue
    
            # Stuff that depends on x, y, and z
    
    0 讨论(0)
  • 2020-12-04 09:06

    There is another way which doesn't rely on defining functions (because sometimes that's less readable for small code snippets), doesn't use an extra outer while loop (which might need special appreciation in the comments to even be understandable on first sight), doesn't use goto (...) and most importantly let's you keep your indentation level for the outer if so you don't have to start nesting stuff.

    if some_condition:
       ...
       if condition_a:
           # do something
           exit_if=True # and then exit the outer if block
    if some condition and not exit_if: # if and only if exit_if wasn't set we want to execute the following code
       # keep doing something
       if condition_b:
           # do something
           exit_if=True # and then exit the outer if block
    if some condition and not exit_if:
       # keep doing something
    

    Yes, that also needs a second look for readability, however, if the snippets of code are small this doesn't require to track any while loops that will never repeat and after understanding what the intermediate ifs are for, it's easily readable, all in one place and with the same indentation.

    And it should be pretty efficient.

    0 讨论(0)
提交回复
热议问题