At 05:39 AM 1/8/2011 -0800, Alice BevanMcGregor wrote:
As a quick note, this proposal would signifigantly benefit from the
simplified syntax offered by PEP 380 (Syntax for Delegating to a
Subgenerator) [1] and possibly PEP 3152 (Cofunctions) [2]. The
former simplifies delegation and exception passing, and the latter
simplifies the async side of this.
Unfortunately, AFIK, both are affected by PEP 3003 (Python Language
Moratorium) [3], which kinda sucks.
Luckily, neither PEP is necessary, since we do not need to support
arbitrary protocols for the "subgenerators" being called. This makes
it possible to simply "yield" instead of "yield from", and the
trampoline functions take care of distinguishing a terminal
("return") result from an intermediate one.
The Coroutine class I suggested, however, *does* accept explicit
returns via "raise StopIteration(value)", so it is actually fully
equivalent to supporting "yield from", as long as it's used with an
appropriate trampoline function.
(In fact, the structure of the Coroutine class I proposed was stolen
from an earlier Python-Dev post I did in an attempt to show why PEP
380 was unnecessary for doing coroutines. ;-) )
In effect, the only thing that PEP 380 would add here is the syntax
sugar for 'raise StopIteration(value)', but you can do that with:
def return_(value):
raise StopIteration(value)
In any case, my suggestion doesn't need this for either apps or
response bodies, since the type of data yielded suffices to indicate
whether the value is a "return" or not. You only need a subgenerator
to raise StopIteration if you want to return something to your caller
that *isn't* a response or body chunk.
_______________________________________________
Web-SIG mailing list
Web-SIG@python.org
Web SIG: http://www.python.org/sigs/web-sig
Unsubscribe:
http://mail.python.org/mailman/options/web-sig/archive%40mail-archive.com