for: else: - any practical uses for the else clause?

Peter Otten __peter__ at web.de
Sat Sep 30 05:22:53 EDT 2006


Paul Rubin wrote:

> Peter Otten <__peter__ at web.de> writes:
>> >      all_heights = (block.height for block in stack if
>> >      block.is_marked()) if is_empty(all_heights):
>> >         raise SomeError("No marked block")
>> 
>> Such a function would have to rebind the generator:
> 
> Yeah, that's what I mean about generators not working the right way.
> 
>> You can make it work, but the result tends to be messy:
> 
> I think it's better underneath, but still syntactically ugly, to just
> defer the generator creation:
> 
>      all_heights = lambda:
>                      (block.height for block in stack if
>                      block.is_marked())

You still need the stop() trick to omit the heights after the marked block.

>      if is_empty(all_heights ()):
>          raise SomeError("No marked block")
>      height = sum(all_heights ())
> 
> Now sum and is_empty see two separate generators, so is_empty is
> straightforward:
> 
>      def is_empty(gen):
>         try:
>            gen.next()
>            return True
>         except StopIteration:
>            return False

Alternatively you can turn all_heights into a list (comprehension) which
makes the test trivial. 

I think it will be interesting to see how Python 3000's emphasis on
iterators will affect overall code complexity.

Peter



More information about the Python-list mailing list