[Python-ideas] for/else statements considered harmful

Arnaud Delobelle arnodel at gmail.com
Thu Jun 7 16:00:39 CEST 2012


On 7 June 2012 00:20, Alice Bevan–McGregor <alice at gothcandy.com> wrote:
> Howdy!
>
> Was teaching a new user to Python the ropes a short while ago and ran into
> an interesting headspace problem: the for/else syntax fails the obviousness
> and consistency tests.  When used in an if/else block the conditional code
> is executed if the conditional passes, and the else block is executed if the
> conditional fails.  Compared to for loops where the for code is repeated and
> the else code executed if we "naturally fall off the loop".  (The new user's
> reaction was "why the hoek would I ever use for/else?")

My solution: don't talk about a for/else construct, but talk about a
for/break/else block instead. Then the semantics become obvious again.

> I forked Python 3.3 to experiment with an alternate implementation that
> follows the logic of pass/fail implied by if/else: (and to refactor the
> stdlib, but that's a different issue ;)
>
>   for x in range(20):
>       if x > 10: break
>   else:
>       pass # we had no values to iterate
>   finally:
>       pass # we naturally fell off the loop
>
> It abuses finally (to avoid tying up a potentially common word as a reserved
> word like "done") but makes possible an important distinction without having
> to perform potentially expensive length calculations (which may not even be
> possible!) on the value being iterated: that is, handling the case where
> there were no values in the collection or returned by the generator.

I think your use of finally is as unfortunate as the current use of
else:  usually, finally is *always* executed, irrespective of what
happened in the try block.  Your new use goes against that.

Cheers,

-- 
Arnaud



More information about the Python-ideas mailing list