Generators versus Coroutines
Lenard Lindstrom
len-1 at telus.net
Sun Aug 15 11:59:25 EDT 2004
Nick Patavalis <npat at efault.net> writes:
> On 2004-08-14, Paul Rubin <> wrote:
> >
> > You can't yield across multiple levels of function calls. That's why
> > they're called "simple generators" instead of just "generators".
> >
>
> For me it would be *tremendously* usefull if one could yield across
> multiple levels of function calls. If this was supported, then most
> uses of O/S treads could be replaced by generators.
>
> Does anyone know if such a feature is planned?
>
Having followed the development of Prothon it is my understanding that
such a thing is not possible in CPython for two reasons. The first is
that the yield statement itself defines a function declaration as a
generator. Without a specific "gen" declarator keyword as in Prothon:
gen evens(n): # This is a generator
for i in n: # "for i in range(n)" in Python
doubleit(i)
def doubleit(i) # This is a helper that yields
yield(2 * x) # "yield 2 * x"
for i in evens(5):
print(i) # "print i"
the yield does not know how many function calls up it must go to return
a value. In CPython it simply saves one frame, that of the current function
call. The second reason is a python function call in CPython involves an
actual recursive C call of the interpreter. So to have a yield span more
than one python function would require saving and restoring part of the
actual C stack - coroutines at the C level - or a rewrite of the interpreter
to not make the recursive C calls as in Stackless Python.
Lenard Lindstrom
<len-l at telus.net>
More information about the Python-list
mailing list