Guido van Rossum wrote:
On Thu, Apr 2, 2009 at 11:37 AM, Jacob Holm <jh@improva.dk> wrote:
Bruce Frederiksen wrote:
Guido van Rossum wrote:
but how about 'return from'? or 'return finally'?(??) ...
Or what about "yield return"? That clearly marks the construct as belonging in a generator. It also mixes well with the idea of a "yield raise" that I mentioned in another mail (not a suggestion for this PEP).
Not totally weird. After all Dave Beazley's trampoline uses "yield g()" to call a sub-generator and "yield x" to return a value x from a sub-generator to the calling generator via the trampoline's stack...
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 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? 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* b) added to close() later if we decide it would be a good idea 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. 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) Cheers, Nick. * For example: def get_result_send(self, g, sentinel=None): # Using a sentinel to tell the generator to finish try: while 1: g.send(sentinel) return None except GeneratorReturn as gr: return gr.value def get_result_throw(self, g, sentinel=GeneratorExit): # Using GeneratorExit to tell the generator to finish try: while 1: try: g.throw(sentinel) except sentinel: break return None except GeneratorReturn as gr: return gr.value -- Nick Coghlan | ncoghlan@gmail.com | Brisbane, Australia ---------------------------------------------------------------