[Python-ideas] for/else syntax

Yuvgoog Greenle ubershmekel at gmail.com
Thu Oct 1 14:12:13 CEST 2009


Thank god for empirical evidence and thanks Antti for the measurement. This
construct should have been named "finally", "didnt_break" or "not break":
while self.more_points_to_check():
    if self.found_it():
        # Found the desired point
        breaknot break:
    # Exhausted the search space :(

On Thu, Oct 1, 2009 at 2:00 PM, Antti Rasinen <ars at iki.fi> wrote:

>
> > Yuvgoog Greenle schrieb:
> >> 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".
> >> The construct is only useful in loops with "break" statements, so in
> >> pseudo code or human the "else" would have probably been translated to
> >> "if didn't break".
> >
> > I agree that the "else" clause is somewhat unintuitive.  However, it has
> > its uses and can often replace more awkward constructs.  As such, I would
> > be -1 on removing it, and -3 on reusing the else clause for some other
> > purpose.
>
> I must say that calling for ... else "somewhat unintuitive" is the
> understatement of the year. The analogy with if ... else leads further
> astray than Odysseus.
>
> The feature itself is not bad. It's just that it is misnamed.
>
> I did a quick poll at the office and at IRC, five people in total, with
> 2-8 years of Python experience. Two had never heard of the for..else
> -construct; one had heard that it exists and two know about it but have
> never used it. Three uninitiated, in other words.
>
> All three gave similar replies: if the loop is not executed or the
> variable is not iterable, then the else-branch is executed. Here are their
> reactions, when they learned how it really works:
>
>  * "It should be called for..then" (or for..finally)
>  * "WHAT. No f** way. Completely unintuitive"
>  * "I'd hate whoever wrote that code"
>
> These people are actual Python developers, not some newbies. And I
> completely agree with them. I've only once seen for...else in the wild and
> never used it myself.
>
> To add further insult to the naming injury, the else branch suffers from
> the fact that 99.9% of the time, the for-loop contains an if:
>
> for x in xs:
>    if cond(x):
>        break
>    # stuff
> else:
>    # more stuff
>
> My code pattern matching algorithm reads that as an indentation error. An
> else matches if so many times more often that decoding for..else requires
> unnecessary effort.
>
> I don't want the feature to be removed or even renamed (at least before
> Python 4). But the feature *is* badly named and unintuitive.
>
> --
> [ Antti Rasinen <*> ars at iki.fi ]
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/mailman/listinfo/python-ideas
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20091001/0add2e79/attachment.html>


More information about the Python-ideas mailing list