<p>If we could go back in time I would completely agree. But since we can't, flipping meaning of else would be too error inducing and therefore not at all likely.</p>
<p>So at risk of bike shedding I would suggest </p>
<p>for ...<br>
[ else not: ]<br>
else [ finally ] : </p>
<p>If a context-sensitive keyword would work I'd go for something more like</p>
<p>for ...<br>
[ else empty: ]<br>
else [ no match ] :</p>
<p>This would not introduce any incompatibilities.</p>
<p>--- Bruce<br>
(from my phone)</p>
<div class="gmail_quote">On Jun 6, 2012 4:31 PM, "Alice Bevan–McGregor" <<a href="mailto:alice@gothcandy.com" target="_blank">alice@gothcandy.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Howdy!<br>
<br>
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?")<br>


<br>
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 ;)<br>
<br>
   for x in range(20):<br>
       if x > 10: break<br>
   else:<br>
       pass # we had no values to iterate<br>
   finally:<br>
       pass # we naturally fell off the loop<br>
<br>
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.<br>


<br>
Templating engines generally implement this type of structure.  Of course this type of breaking change in semantics puts this idea firmly into Python 4 land.<br>
<br>
I'll isolate the for/else/finally code from my fork and post a patch this week-end, hopefully.<br>
<br>
        — Alice.<br>
<br>
<br>
______________________________<u></u>_________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/python-ideas" target="_blank">http://mail.python.org/<u></u>mailman/listinfo/python-ideas</a><br>
</blockquote></div>