[Python-ideas] if condition: break idiom

Adam Olsen rhamph at gmail.com
Sun Sep 21 06:53:01 CEST 2008


On Sat, Sep 20, 2008 at 10:06 PM, Carl Johnson <carl at carlsensei.com> wrote:
>> An alternate construct could be something like:
>>
>> """
>> def While(x):
>>  if x > 10:
>>   return None
>>  else:
>>   return x
>>
>> [w for w in (While(x) for x in range(20)) if w is not None]
>> """
>
> The problem is that this version won't work if range(20) is replaced with
> itertools.count() or any other non-finite generator, whereas the raise Break
> version will.
>
> Another nice thing about using raise for loop control is that "raise
> Continue" can be used to skip elements:
>
> def even(x):
>    if x % 2:
>        raise Continue
>    else:
>        return x
>
> [even(x) for x in range(10)] # [0, 2, 4, 6, 8]
>
> This would have to be broken in two parts to do in current Python (and
> indeed, that might be the chief advantage of *not* adopting my
> proposal--TOOWTDI):

def foo():
    for x in range(10):
        if even(x):
            print "Even!"
        else:
            print "Odd!"

I would never expect a function could raise an exception which is
silently swallowed up.  Having break be a statement enforces locality,
a good thing IMO.

generator expressions may currently swallow up StopIteration, but I
argue this is a bug.  It may not be worth fixing, but it's a bug
nonetheless.

The sweet spot for list-comps and generator expressions is when
they're *simple*.  Once they start to get complicated or fancy (such
as making them exit early) you should switch to an explicit
for-statement; more lines really is more readable.

-- 
Adam Olsen, aka Rhamphoryncus



More information about the Python-ideas mailing list