[Python-ideas] for/except/else

Wolfgang Maier wolfgang.maier at biologie.uni-freiburg.de
Wed Mar 1 07:16:11 EST 2017


On 01.03.2017 12:56, Steven D'Aprano wrote:
> On Wed, Mar 01, 2017 at 10:37:17AM +0100, Wolfgang Maier wrote:
>
>> Now here's the proposal: allow an except (or except break) clause to
>> follow for/while loops that will be executed if the loop was terminated
>> by a break statement.
>
> Let me see if I understand the proposal in full. You would allow:
>
>
>     for i in (1, 2, 3):
>         print(i)
>         if i == 2:
>             break
>     except break:  # or just except
>         assert i == 2
>         print("a break was executed")
>     else:
>         print("never reached")  # this is never reached
>     print("for loop is done")
>
>
> as an alternative to something like:
>
>
>     broke_out = False
>     for i in (1, 2, 3):
>         print(i)
>         if i == 2:
>             broke_out = True
>             break
>     else:
>         print("never reached")  # this is never reached
>     if broke_out:
>         assert i == 2
>         print("a break was executed")
>     print("for loop is done")
>
>

correct.

> I must admit the suggestion seems a little bit neater than having to
> manage a flag myself, but on the other hand I can't remember the last
> time I've needed to manage a flag like that.
>
> And on the gripping hand, this is even simpler than both alternatives:
>
>     for i in (1, 2, 3):
>         print(i)
>         if i == 2:
>             assert i == 2
>             print("a break was executed")
>             break
>     else:
>         print("never reached")  # this is never reached
>     print("for loop is done")
>

Right, that's how you'd likely implement the behavior today, but see my 
argument about the two alternative code branches not ending up together 
at the same level of indentation.

>
>
> There are some significant unanswered questions:
>
> - Does it matter which order the for...except...else are in?
>   Obviously the for block must come first, but apart from that?
>

Just like in try/except/else, the order would be for (or 
while)/except/else with the difference that both except and else would 
be optional.

> - How is this implemented? Currently "break" is a simple
>   unconditional GOTO which jumps past the for block. This will
>   need to change to something significantly more complex.
>

Yeah, I know that's why I listed this under cons.

> - There are other ways to exit a for-loop than just break. Which
>   of them, if any, will also run the except block?
>

None of them (though, honestly, I cannot think of anything but 
exceptions here; what do you have in mind?)

>
>



More information about the Python-ideas mailing list