[Python-ideas] SyntaxWarning for for/while/else without break or return?

Steven D'Aprano steve at pearwood.info
Fri Oct 9 04:23:24 CEST 2009


On Thu, 8 Oct 2009 08:24:46 pm Yuvgoog Greenle wrote:
> In order to understand the "else" clause it's better that you think
> of it as an "if not break" after the loop.

That is completely wrong. for...else is a single block, and break jumps 
to the end of the block. See my previous reply for details.

for x in seq:
    whatever
else:
    suite


is a single block. It's not the same as:

for x in seq:
    whatever
suite

even if they happen to execute the same way. In the first case, the 
entire block is one single lump of code. In the second case, you have 
two independent lumps of code, a for-loop with no else, followed by an 
independent bunch of code following it.

Lumps of code in this sense are a weaker grouping than functions, 
classes or modules, but they are a grouping. When you see for...else 
you KNOW that the else-suite belongs with the for without needing to 
read the suite in detail. You can't pick it up and move it somewhere 
else and expect it to work, they belong together, in that order. The 
presence of the else tells the reader that the entire for...else block 
is one single conceptual unit.

This extra information is missing in the second case, where there is 
nothing suggesting that suite belongs with the for-loop: they look 
independent. To learn that they're not, you have to read the code in 
enough detail to understand it fully.



-- 
Steven D'Aprano



More information about the Python-ideas mailing list