send() to a generator in a "for" loop with continue(val)??
__peter__ at web.de
Sat Apr 18 11:44:27 CEST 2009
Dale Roberts wrote:
> I've started using generators for some "real" work (love them!), and I
> need to use send() to send values back into the yield inside the
> generator. When I want to use the generator, though, I have to
> essentially duplicate the machinery of a "for" loop, because the "for"
> loop does not have a mechanism to send into the generator. Here is a
> toy example:
> def TestGen1():
> for i in xrange(3):
> sendval = yield i
> print " got %s in TestGen()" % sendval
> g = TestGen1()
> sendval = None
> while True:
> val = g.send(sendval)
> print 'val in "while" loop %d' % val
> sendval = val * 10
> except StopIteration: pass
> I have to explicitly create the generator with an assignment, send an
> initial None to the generator on the first go, then have to catch the
> StopIteration exception. In other words, replicate the "for"
> mechanism, but use send() instead of next().
> It would be nice if I could just do this instead:
> for val in TestGen1():
> print 'val in "for" loop %d' % val
> ...or something similar. Is this an old idea? Has it been shot down in
> the past already? Or is it worth pursuing? I Googled around and saw
> one hit here:
> but not much follow-up.
> I wonder if people want to keep the idea of an "iterator" style
> generator (where send() is not used) separate from the idea of a "co-
> routine" style generator (where send() is used). Maybe combining the
> two idioms in this way would cause confusion?
> What do folks think?
If it were up to me I'd rip out send() immediatly. At first I thought I
would see a compelling use case and be enlightened, but it never happened.
I just grepped the python 3 source for '= yield' and the only matches were
in the unit tests for generators and parser.
Let it die while it hasn't polluted the wider code base.
More information about the Python-list