[Python-Dev] Minimal 'stackless' PEP using generators?
Clark C. Evans
cce at clarkevans.com
Mon Aug 23 20:33:15 CEST 2004
On Mon, Aug 23, 2004 at 01:18:28PM -0400, Phillip J. Eby wrote:
| It would be nice if there were some way to "accept" data and exceptions
| within a generator that didn't require the 'events.resume' hack, e.g.:
|
| result = yield aDeferred
|
| would be really nice, especially if 'result' could cause an exception to
| be raised. I was hoping that this was something along the lines of what
| you were proposing.
Perhaps it would be nice to add an alternative syntax to call a
generator when you are expecting exactly one value.
def generator():
yield 'one value'
def consumer():
value = generator()
This, when combined with the previous proposal would give:
>>> def top():
>>> yield cooperate
>>> yield "one value"
>>>
>>> def middle():
>>> """ intermediate generator _only_ sees 'one value' """
>>> bing = top()
>>> # do something with bing
>>> yield bing
>>>
>>> def lower():
>>> """ this is not a generator, so it sees cooperate """
>>> for x in middle():
>>> print x
>>>
>>> lower()
cooperate
one value
| Perhaps there should be a "simple coroutines" PEP, that doesn't try to
| extend generators into coroutines, but instead treats coroutines as a
| first-class animal that just happens to be implemented using some of the
| same techniques "under the hood".
The problem is maintaining a 'stack' of generators requires that
intermediate generators in the stack need a tedious hack (in both
peek.event and twisted.flow) for them to work. If we can have python
allow messages to be sent from the top-most generator to the inner-most
non-generator (via yield cooperate, or some other magic), this
difficulty is resolved -- intermediate generators can then be written in
a operational style, without icky hacks for managing deferred execution.
Full-blown corountines arn't necessary. A small tweak to generators
will do.
Best,
Clark
More information about the Python-Dev
mailing list