[Python-Dev] PEP 340: Breaking out.

Josiah Carlson jcarlson at uci.edu
Thu May 5 20:08:35 CEST 2005


Ka-Ping Yee <yahoo at zesty.ca> wrote:
> 
> On Thu, 5 May 2005, Josiah Carlson wrote:
> > Ka-Ping Yee <python-dev at zesty.ca> wrote:
> > >     continue with 2
> >
> > There is something about <action> <which> <level> that I just don't like.
> 
> Just to clarify: if by <level> you mean "nesting level", did it appear
> that the 2 in my example was a count of block levels?  I didn't
> mean it that way -- the 2 is a value passed in to the generator
> that appears as the value of the "yield" expression, as in PEP 340.

I remember reading that, but I seem to have forgotten it when I was
composing my reply.  Thankfully, sleeping on it has helped me discover
what I really don't like.  With the 'passing value' semantic, the
<action> [ <which> ] [ <value> ] is only useful for the deepest loop of
a particular type. Take for example...

for ...:
    for ...:
        for ...:
            break/continue [for]


That break or continue can only affect that last for loop.  It doesn't
make any easier the use of nested fors, nested whiles, or even nested
blocks.  It only really helps you if you mix and match all possible
looping constructs, and even then, only gives the granularity of the
most recent block of a particular type.  In that sense, I think it is a
nonstarter, because it doesn't really add functionality in common uses
of for and while statements.

If one allowed <action> [<which>] [<value>] , [<level>], then one could
jump to arbitrary loops.  Now, I'm not condoning this, and I don't even
like it.  Sure, it allows breaking or continuing to any for, while, or
block statement in the current scope, but the <level> argument is as
equivalently ambiguous as package-relative imports using a leading
integer (http://python.org/peps/pep-0328.html).

Now, one can remove ambiguity if we were able to 'label' while loops and
for loops producing <action> [ <label> ] , [ <value> ], but at that
point we are getting into the discussion of a loop-aware goto with
loop/block cleanup, and a syntax for labeling loops.  Ick.

 - Josiah



More information about the Python-Dev mailing list