[Python-ideas] if condition: break idiom

Carl Johnson carl at carlsensei.com
Sun Sep 21 09:25:48 CEST 2008


Ron Adam wrote:

> Maybe break should raise a StopIteration and continue should raise  
> NextIteration?

The trouble with that is that semantically, right now, StopIteration  
gets caught only during the testing to see if the iteration should go  
for another loop around, not during the body of the loop. Here are  
some illustrations of the current behavior:

 >>> def blah():
...  yield 1
...  raise StopIteration
...  yield 2
...
 >>> for x in blah():
...  print(x)
...
1

As you can see, it silently swallows the StopIteration raised when  
evaluating the iterator produced by blah().

 >>> def blah():
...  raise StopIteration
...
 >>> for x in blah():
...   print("hi")
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in blah
StopIteration

Above, the exception isn't swallowed, since blah() hadn't yet been  
evaluated, since it's a function, not a generator.

And if you try to use StopIteration like break, that just won't work:

 >>> for x in range(2):
...  raise StopIteration
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
StopIteration
 >>>

This is why if my proposal were accepted we would need three loop  
controlling exceptions: StopIteration, to halt the loop while fetching  
the next value; ContinueIteration, to simulate the behavior of  
continue; and BreakIteration, to simulate the behavior of break.

-- Carl



More information about the Python-ideas mailing list