[Python-ideas] Possible PEP 380 tweak
Nick Coghlan
ncoghlan at gmail.com
Sat Oct 30 06:26:48 CEST 2010
On Sat, Oct 30, 2010 at 2:05 PM, Nick Coghlan <ncoghlan at gmail.com> wrote:
> To give some formal semantics to the new statement:
Oops, those would be some-formal-but-incorrect semantics that made the
StopIteration exceptions visible in the current frame. Fixed below to
actually kill the current frame properly, letting the generator
instance take care of turning the return value into a StopIteration
exception.
# RETURN FROM semantics
_i = iter(EXPR)
_m, _a = next, (_i,)
# _m is a function or a bound method;
# _a is a tuple of arguments to call _m with;
# both are set to other values further down
while 1:
# Move the generator along
# Unlike YIELD FROM, we convert StopIteration
# into an immediate return (since this is a tail call)
try:
_y = _m(*_a)
except StopIteration as _e:
return _e.value
# Yield _y and process what came back in
try:
_s = yield _y
except GeneratorExit as _e:
# Request to exit
try:
# Don't reuse _m, since we're bailing out of the loop
_close = _i.close
except AttributeError:
pass
else:
# Unlike YIELD FROM, we return the
# value of the inner close() call
return _close()
# If there is no inner close() attribute,
# we just return None
return
except BaseException as _e:
# An exception was thrown in; pass it along
_a = sys.exc_info()
try:
_m = _i.throw
except AttributeError:
# Can't throw it in; throw it back out
raise _e
else:
# A value was sent in; pass it along
if _s is None:
_m, _a = next, (_i,)
else:
_m, _a = _i.send, (_s,)
# Unlike YIELD FROM, this is a statement, so there is no RESULT
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
More information about the Python-ideas
mailing list