[Python-ideas] Yet another alternative name for yield-from

Jacob Holm jh at improva.dk
Fri Apr 3 01:14:01 CEST 2009


Nick Coghlan wrote:
> Using 'yield return' rather than a bare return wouldn't get any
> objections from me. As has been said before, the current SyntaxError
> definitely makes it easier to learn some of the ins and outs of generators.
>
> That would leave us with:
>
> 'yield': pass a value back to and receive a value from this generator's
> client
> 'yield from': pass control to a subgenerator and receive a value back
> from it
> 'yield return': finish this generator with GeneratorReturn
> 'return': finish this generator with StopIteration
>   

FWIW, I still don't see the need for a GeneratorReturn exception.  I 
don't understand why it should be an error to ignore the return value, 
or to loop over a generator that returns a value.  I assume it makes 
sense to someone since it is being discussed, so perhaps one of you 
someones would care to explain it?

> I think that leaves us with one remaining question: should we save the
> return value on the generator iterator and make it available as the
> return value of the close() method?
>   

I think so, yes.  It makes a big difference to some of the examples I 
have shown.

> My inclination is that finalising a generator in a way that allows the
> return value to be retrieved should be left out of the PEP for now, as
> it is something that can be:
> a) easily done externally to the generator*
>   

Yes, you can hack your way around most limitations.  In this case if you 
need the feature it makes quite a big difference to both the calling and 
the called code.

> b) added to close() later if we decide it would be a good idea
>   

That is true, but I think the semantics of "yield-from" becomes more 
coherent if we do it now.  Alternatively, we could drop the "yield 
return" idea from the proposal and make "yield from" a statement.  I 
would hate to see it go because coupled with returning the value from 
close it has some really nice uses, but that would be the other way I 
see to make the proposal coherent.   Having "yield return" without 
returning the value from close just feels wrong.

> In order to leave that avenue open in the future however, close() must
> be defined in the PEP to trap GeneratorReturn as well as StopIteration.
>   

But if we do that without storing the value and returning it on the next 
close, you cannot use "yield return" as a response to GeneratorExit in a 
subiterator without losing the returned value.  (This of course depends 
on how we end up handling GeneratorExit and close in the yield-from 
expression).  Instead you will need to manually raise a different 
exception in the subiterator.  And if you do that, the resulting 
generator can no longer be closed *without* some wrapper to catch the 
exception.


> So +1 to having close() accept GeneratorReturn as a legitimate reaction
> to being thrown GeneratorExit, but -0 on saving the return value on the
> generator iterator object (at least in the initial version of the PEP)
>
>   

And I am +1/+1 on this, although I would rather see the "yield return" 
statement just storing the value directly on the generator, raising a 
normal StopIteration, and not using a GeneratorReturn exception at all.

- Jacob




More information about the Python-ideas mailing list