Regarding http://www.python.org/dev/peps/pep-0380/, "Syntax for Delegating to a Subgenerator":
The first call can only be .next(), there's no way to provide an initial value to .send(). That matches common use, but an initial .send() is possible if .next() was called before "yield from". So I suggest: RESULT = yield from EXPR [with SEND_FIRST] # default SEND_FIRST=None The code under Formal Semantics uses .throw and .close = None as equivalent to absent attributes, which is not what the textual description says. I think the code should delete values when it no longer has use for them, so they can be garbage-collected as quickly as possible. So the formal semantics would be something like i, snd, yld, throw = iter(EXPR), SEND_FIRST, None, None res = absent = object() # Internal marker, never exposed try: while res is absent: try: yld = (i.next() if snd is None else i.send(snd)) except StopIteration as e: res = e.value else: snd = absent # 'del snd', but that could break 'finally:' while yld is not absent: try: snd = yield yld yld = absent except: del yld if throw is None: # optional statement throw = getattr(i, 'throw', absent) if throw is absent: getattr(i, 'close', bool)() # bool()=dummy raise x = sys.exc_info() try: yld = throw(*x) except StopIteration as e: if e is x[1] or isinstance(x[1], GeneratorExit): raise res = e.value finally: del x finally: del i, snd, throw RESULT = res del res Maybe it's excessive to specify all the 'del's, but I'm thinking the 'with' statement might have destroyed or set to None the 'as <foo>' variable today if the spec had taken care to specify deletes. -- Hallvard -- http://mail.python.org/mailman/listinfo/python-list