[Python-ideas] Yield-From: Finalization guarantees
jh at improva.dk
Sun Mar 29 14:33:51 CEST 2009
Greg Ewing wrote:
> Nick Coghlan wrote:
>> Generators that catch and do anything with GeneratorExit other than turn
>> it into StopIteration are almost always going to be broken - the new
>> expression needs to avoid making it easy to do that accidentally.
> However, as this example shows, the suggested solution
> of reraising GeneratorExit is not viable because it
> violates the inlining principle.
> The basic problem is that there's no way of telling the
> difference between a StopIteration that means "it's okay,
> I've finalized myself" and "I really mean to return
> normally here".
Would it be possible to attach the current exception (if any) to the
StopIteration/GeneratorReturn raised by a return statement in a finally
clause? (Using the __traceback__ and __cause__ attributes from PEP-3134)
Then the PEP expansion could check for and reraise the attached
exception. Now that I think about it, this is almost required by the
inlining/refactoring principle. Consider this example:
val = yield from inner()
Which I think should be equivalent to:
val = 'VALUE'
The problem is that any exception thrown into inner is converted to a
GeneratorReturn, which is then swallowed by the yield-from instead of
More information about the Python-ideas