PEP proposal: sequence expansion support for yield statement: yield *

Steven D'Aprano steve at pearwood.info
Wed Apr 20 20:21:31 EDT 2016


On Thu, 21 Apr 2016 05:34 am, Ken Seehart wrote:

> Currently the common pattern for yielding the elements in a sequence is as
> follows:
> 
>   for x in sequence: yield x
> 
> I propose the following replacement (the result would be identical):
> 
>   yield *sequence

Others have already pointed out that this already exists as "yield from
iter(sequence)", but I'd like to say that this syntax was not added merely
to shorten the "for x in sequence: yield x" idiom.

In its simplest case, "yield from expr" is equivalent to "for x in expr:
yield x", and it is completely reasonable to use it for such simple
purposes. But that's not why it was added to the language, and if that's
*all* it did, it probably wouldn't have been.

Rather, "yield from" was added to support the full set of generator
behaviour, including their send(), close() and throw() methods. That
makes "yield from expr" equivalent to this rather formidable chunk of code:



_i = iter(EXPR)
try:
    _y = next(_i)
except StopIteration as _e:
    _r = _e.value
else:
    while 1:
        try:
            _s = yield _y
        except GeneratorExit as _e:
            try:
                _m = _i.close
            except AttributeError:
                pass
            else:
                _m()
            raise _e
        except BaseException as _e:
            _x = sys.exc_info()
            try:
                _m = _i.throw
            except AttributeError:
                raise _e
            else:
                try:
                    _y = _m(*_x)
                except StopIteration as _e:
                    _r = _e.value
                    break
        else:
            try:
                if _s is None:
                    _y = next(_i)
                else:
                    _y = _i.send(_s)
            except StopIteration as _e:
                _r = _e.value
                break
RESULT = _r




See PEP 380 for more info:

https://www.python.org/dev/peps/pep-0380/


-- 
Steven




More information about the Python-list mailing list