[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