[Python-ideas] for/else syntax

Steven D'Aprano steve at pearwood.info
Sat Oct 3 03:46:24 CEST 2009

On Sat, 3 Oct 2009 11:18:44 am Carl Johnson wrote:

> I don't mean to pick on Gerald, but he got the meaning of for/else
> dead wrong *in the middle of a debate about for/else*. This shows
> that even experienced Pythoneers who read Python-ideas can be
> confused about the meaning of for/else. Using it in production code 
> means leaving a trap for the programmers who come after you and read
> your code to get confused and create a bug. Yes, when the others turn
> your working use of for/else into a bug, it's their fault for not
> reading the tutorial more closely so as not get confused by it, but
> ultimately no matter how much you blame the user, that won't stop the
> next guy who uses your code from misunderstanding it.

Damn straight it's their fault. I hope you're not suggesting that people 
shouldn't use any feature that might be misunderstood by lazy, ignorant 
or stupid developers?

> The best solution to this inherent confusingness is to leave bare
> for/else alone for the foreseeable future, but to add a less
> confusing synonym for this feature. I propose "else not break:"
> although "elif not break:" is good too. 

You can already do this today, with no change to the compiler, using 
only a slightly different syntax to that suggested: 

for i, j in enumerate(something):
    # suite
    i += 1
else:  # if not break
    i = 0

Best of all, it's an extensible syntax, so there's no need for 
bike-shedding arguments about whether it should be spelled "not break" 
or "no break" or "didn't break" or "only if loop ended normally". All 
of these variants, and more, are accepted:

for i, j in enumerate(something):
    # suite
    i += 1
else:  # no break occurred and so the loop ended normally
    i = 0

Steven D'Aprano

More information about the Python-ideas mailing list