generator - How to get return value from coroutine in python -
i'm trying coroutines pipeline according http://www.dabeaz.com/coroutines/coroutines.pdf
the question is, how can value sink
rather print it?
take code example
def coroutine(func): def start(*args, **kwargs): cr = func(*args, **kwargs) next(cr) return cr return start @coroutine def produce(target): while true: n = (yield) target.send(n*10) @coroutine def sink(): try: while true: n = (yield) print(n) except generatorexit: pass sk = sink() pipe = produce(sink())
with code get:
>>> pipe.send(10) 100
then want return value rather print it, try yield sink:
@coroutine def sink(): try: while true: yield (yield) except generatorexit: pass
but seems not working, pipe.send(10)
still returns none
rather generator.
so how shall return value?
why should pipe.send
return generator? , going returned value?
whatever is, should done in sink
.
you could, however, change functions to
@coroutine def produce(target): while true: n = (yield) yield target.send(n*10) @coroutine def sink(): try: while true: yield (yield) except generatorexit: pass
to yield value yielded target
, pipe.send(10)
return 100
instead of printing it.
but mix producer , consumer, potentially give headache.
in response comment:
from collections import defaultdict def coroutine(func): def start(*args, **kwargs): cr = func(*args, **kwargs) next(cr) return cr return start @coroutine def produce(key, target): while true: n = (yield) target.send((key, n*10)) class sink(object): def __init__(self): self.d = defaultdict(lambda: none) self.co = self.sink() def send(self, *args): self.co.send(*args) @coroutine def sink(self): try: while true: key, n = yield self.d[key] = max(self.d[key], n) except generatorexit: pass sk = sink() pipea = produce("a", sk) pipeb = produce("b", sk) pipea.send(10) pipea.send(20) pipea.send(40) pipeb.send(20) pipeb.send(40) pipeb.send(60) print sk.d.items() # [('a', 400), ('b', 600)]
Comments
Post a Comment