[Python-ideas] for/except/else syntax

Yuvgoog Greenle ubershmekel at gmail.com
Wed Oct 7 09:00:05 CEST 2009

I don't like your "except" and "else" only because it's not obvious
when they execute.

btw your example breaks the current "for..else" search idiom. C,
suite_if_loop_is_not_broken, should be labelled
suite_if_loop_is_not_broken_and_not_empty in your example code.

As I understand it, pythoneers need a way to know what happened with a
previous loop. Did it break? Did it execute at all? The answer to both
questions is either True or False and developers need these answers
only after the loop finished. If python wasn't in over it's head with
reserved words I would suggest adding "loop":

for i in SEQ:
if not loop.broke:
    C # suite_if_loop_is_not_broken
elif loop.empty:
    B  # suite_if_loop_body_is_not_executed

For optimization I would suggest the "loop" variable only be
instantiated if it's referenced. Also, there may be better names for
"loop", "broke" and "empty".

Two drawbacks:
1. python's in over it's head with reserved words.
2. developers might want to use the "loop" variable a mile down from
the loop which would be ugly but their fault.

I'm writing a summary of the previous for/else thread and hope that by
the time I finish that (a week+), someone will invent a readable,
low-cost syntax (optional but awesome if it can handle all 4:
break/not break/empty/not empty).

On Wed, Oct 7, 2009 at 6:06 AM, Bruce Leban <bruce at leapyear.org> wrote:
> Here you go:
> do_except = True
> for i in SEQ:
>   do_except = False
>   A
> else:
>   if not do_except:
>     C  # suite_if_loop_is_not_broken
> if do_except:
>   B  # suite_if_loop_body_is_not_executed
> --- Bruce
> On Tue, Oct 6, 2009 at 8:53 PM, Guido van Rossum <guido at python.org> wrote:
>> On Tue, Oct 6, 2009 at 8:46 PM, Bruce Leban <bruce at leapyear.org> wrote:
>> > Switching gears a bit, here's what I want:
>> >
>> > for_stmt ::= "for" target_list "in" expression_list ":" suite_loop_body
>> > ["except" ":" suite_if_loop_body_is_not_executed] ["else" ":"
>> > suite_if_loop_is_not_broken]
>> >
>> > The except and else appear in this order to make it clear that except
>> > takes
>> > precedence. If the loop body is not executed at all then both conditions
>> > are
>> > true but it obviously is only useful if except takes precedence.
>> > Comments?
>> I'm sure it's obvious to you what the except clause should do, but it
>> isn't to me. :-( Assuming you're not proposing we change the meaning
>> of else in the absence of except, and that its meaning together with
>> except is a logical extension of this, can you show how we should
>> translate a for-loop with an except clause into current Python? Say,
>> what would I be writing today to get the exact effect of your proposed
>> for i in SEQ:
>>  A
>> except:
>>  B
>> else:
>>  C
>> ?
>> --
>> --Guido van Rossum (home page: http://www.python.org/~guido/)
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> http://mail.python.org/mailman/listinfo/python-ideas

More information about the Python-ideas mailing list