[Python-ideas] Yield-From: Finalization guarantees

Ron Adam rrr at ronadam.com
Fri Apr 3 02:35:43 CEST 2009



Jacob Holm wrote:

> That might be the prevailing wisdom concerning GeneratorExit, at least 
> partly based on the fact that the only way to communicate anything 
> useful out of a closing generator is to raise another exception.   
> Thinking a bit about coroutines, it would be nice to use "send" for the 
> normal communication and "close" to shut it down and getting a final 
> result.  Example:
> 
> def averager():
>    count = 0
>    sum = 0
>    while 1:
>        try:            val = (yield)
>        except GeneratorExit:
>            return sum/count
>        else:
>            sum += val
>            count += 1
> 
> avg = averager()
> avg.next() # start coroutine
> avg.send(1.0)
> avg.send(2.0)
> print avg.close()  # prints 1.5
> 
> 
> To do something similar today requires either a custom exception, or the 
> use of special values to tell the generator to yield the result.  I find 
> this version a lot cleaner.

This doesn't seem less cleaner than the above to me.

def averager():
     sum = 0
     count = 0
     try:
         while 1:
             sum += yield
             count += 1
     finally:
         yield sum / count

avg = averager()
avg.next()
avg.send(1.0)
avg.send(2.0)
print avg.next()   # prints 1.5










More information about the Python-ideas mailing list