[Python-ideas] for/else syntax
steve at pearwood.info
Fri Oct 2 07:06:17 CEST 2009
On Thu, 1 Oct 2009 11:07:19 am Yuvgoog Greenle wrote:
> On python-dev the subject of for/else statements came up, so I had to
> mention how "ambiguous" the syntax seems to me. By "ambiguous" I
> meant that it's not obvious what should happen in the for/else and
> while/else constructs (the except/else construct is readable and
> great imo btw).
> Even though it's documented, for me it's a bad construct because it
> can and will always be misinterpreted by a non-trivial amount of
> people seeing it for the first time. It's unreadable and confusing
> because the "else" isn't referring to the "for" it's in reference to
> the "break".
That's a very fine distinction you are drawing, and I don't think it is
useful. The else block runs when you exit the for-loop normally, by
falling off the end. There are three ways to exit the for-loop without
falling off the end: break, raise and return. raise and return are
special: return exits the function immediately, nothing further gets
run, and uncaught exceptions do similar. So the only way to exit a
for-loop abnormally and still keep processing is with break. Hence you
argue that the else refers to the break. But of course you can't have a
break outside of a for loop, so else is equally associated with for.
And in fact, it is legal to have for loops without a break but include
an else. Is it useful? I don't know, but Python can't forbid them
without breaking (pun not intended) code like this:
for x in xs:
"if __debug__: suite" is special: the Python compiler optimizes the
entire suite away when running with the -O flag. So if Python would
treat the presence of an else as an error unless there was a break, you
could have some code which was, or wasn't, legal according to the
presence of the optimize flag. This is clearly a Bad Thing.
Hence, even if for...else with no breaks are useless, they must be
> To make things worse, it's not that newcomers will say "hmm, what
> does this for/else thing do? lets look at the manual", they will
> mistakenly assume they understand what the construct means. For
> evidence, see the for/else construct in the django templating
> language where "else" means the loop didn't run.
That's not evidence of what newcomers will do. It's evidence that other
languages can do things differently from Python.
More information about the Python-ideas