[Python-ideas] Revised**5 PEP on yield-from

Jim Jewett jimjjewett at gmail.com
Mon Mar 2 04:34:48 CET 2009


On 3/1/09, Jacob Holm <jh at improva.dk> wrote:
> Greg Ewing wrote:
>> Jacob Holm wrote:

[naming that for which R waits]
>>> A
>>>  \
>>>    R --- X (=whatever R is waiting for)
>>>  /
>>> B

>> But in any case, I think you can still model this as two separate
>> stacks, with R appearing in both stacks: [A, R] and [B, R].

[A, R, X] and [B, R, X]

>> Whichever
>> one of them finishes yielding from R first pops it from its stack,
>> and when the other one tries to resume R it gets an exception. Either
>> that or it breaks out of its yield-from early and discards its
>> version of R.
> I am not worried about R running out, each of A and B would find out
> about that next time they tried to get a value. I *am* worried about R
> doing a yield-from to X (the xrange in this example) which then needs to
> appear in both stacks to get the expected behavior from the PEP.

I would assume that the second one tries to resume, gets the
StopIteration from X, retreats to R, gets the StopIteration there as
well, and then continues after its yield-from.

If that didn't happen, I would wonder whether (theoretical speed)
optimization was leading to suboptimal semantics.

>> > As long as that scenario is possible I can construct
>>> an example where treating it as a simple stack will either do the
>>> wrong thing, or do the right thing but slower than a standard "for v
>>> in it: yield v".

I have to wonder whether any optimization will be a mistake.  At the
moment, I can't think of any way to do it without adding at least an
extra pointer and an extra if-test.  That isn't much, but ... how
often will there be long chains, vs how often are generators used
without getting any benefit from this sort of delegation?

-jJ



More information about the Python-ideas mailing list