[Python-ideas] Proto-PEP on a 'yield from' statement

Antoine Pitrou solipsis at pitrou.net
Fri Feb 13 01:13:59 CET 2009


Greg Ewing <greg.ewing at ...> writes:
> 
> Additionally, generators will be allowed to execute a ``return``
> statement with a value, and that value will be passed as an argument
> to the ``StopIteration`` exception.

What is the use of it?
The problem I can see is that in normal iteration forms (e.g. a "for" loop), the
argument to StopIteration is ignored. Therefore, a generator executing such a
return statement and expecting the caller to use the return value wouldn't be
usable in normal iteration contexts.

> ::
> 
>      result = yield from iterator
> 
> is semantically equivalent to
> 
> ::
> 
>      _i = iterator
>      try:
>          _v = _i.next()
>          while 1:
>              if hasattr(_i, 'send'):
>                  _v = _i.send(_v)
>              else:
>                  _v = _i.next()
>      except StopIteration, _e:
>          _a = _e.args
>          if len(_a) > 0:
>              result = _a[0]
>          else:
>              result = None

There seems to lack at least a "yield" statement in this snippet.

Also, why doesn't it call iter() first? Does it mean one couldn't write e.g. 
"yield from my_list"?

Besides, the idea of getting the "result" from the /inner/ generator goes
against the current semantics of "result = yield value", where the result comes
from the /outer/ calling routine.

Regards

Antoine.





More information about the Python-ideas mailing list