At 08:21 PM 7/24/2010 -0700, Guido van Rossum wrote:
FWIW, the thing that was harder to debug when I tried to write some
code involving generators and a trampoline recently, was thinking of a
function as a generator without actually putting a yield in it
(because a particular version of a coroutine pattern didn't need to
block at all). Monocle uses a decorator to flag all coroutines which
fixes this up in the right way, which I think is clever, but I'm torn
about the need to flag every coroutine with a decorator -- Monocle
makes the decorator really short (@_o) because, as Raymond (not
Monocle's author but its advocate at EuroPython) said, "you'll be
using this hundreds of times". Which I find disturbing in itself.
I haven't used Monocle, but in all the libraries I've written myself
for this sort of thing (Trellis and peak.events), a decorator is only
required for a generator that is a "root" task; everything else is
just a normal generator.
For example, in Trellis you use @Task.factory to mark a function as
spawning an independent task each time it's called, but subgenerator
functions called within the task don't need to be marked, and in fact
the "yield from" is just a "yield" - the trampoline expects all
yields of generators to be subgenerator calls. (PEP 380 can't do
this of course, since it also doubles as a sort of 'yield *' - i.e.,
you may care about the yielded values)
Note, though, that even in the sketch I just gave, you don't *really*
need to decorate every function, just the ones that need to be called
from *non*-decorated functions... i.e. "root" coroutines. Even
then, you could *still* skip the decorator and replace:
an_iter = decorated_root_function()
with:
an_iter = From(undecorated_root_function())
and not need to decorate *anything*.
_______________________________________________
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com