On Mon, Aug 2, 2010 at 12:39 PM, Guido van Rossum firstname.lastname@example.org wrote:
OTOH I do appreciate the desire to reduce the number of places where one has to sprinkle 'yield' over one's code, and I've had a number of situations recently where I had something that logically needed to be a coroutine (to match some API) but just happened not to need any yields, and inevitably my coding went something like (1) forget to put a yield in, (2) frantically debug, (3) slap forehead, (4) add "if 0: yield" to the function, (5) continue with another instance of this, (6) lose sleep over the best place to spell the dummy yield and where to put it. At the same time I don't want to have to mark all my coroutines with a decorator, like Monocle requires (though maybe I should).
We already use decorators to change interfaces so I am +1 on reusing what people already know. contextlib.contextmanager is shorthand for "the following function is shorthand for a contextmanager"
from contextlib import contextmanager @contextmanager def myfunc(...): ...
So the generator equivalent would be
from somelib import generator @generator def myfunc(...): ...
Where generator is as simple as def generator(func): def inner(*args, **opts): if False: yield return func(*args, **opts) return inner
But the bulk of Greg's proposal is to transform the called function in one of two ways In the original: to make this return func(*args, **opts) equivalent to this yield from func.__cocall__(*args, **opts) # func must be defined with 'codef' or support __cocall__
Or in his second suggested form to make this cocall func(*args, **opts) equivalent to this yield from func.__cocall__(*args, **opts) # func must support __cocall__
I'm not sure if the "codef" keyword is included in the second form.
I'm -1 on the first proposal because it buries that the calling function is a generator. "yield from" (which it would be a synonym or replacement for) lets you know the called function is a generator without having to read the body of the called function.
I'm -1 on the 2nd form (explicit "cocall") because it is a synonym for "yield from" and "yield from" fits my brain better because reads as "this is yield-like but slightly different."