[Python-ideas] PEP 380 alternative: A yielding function
Scott Dial
scott+python-ideas at scottdial.com
Wed Jul 28 18:54:42 CEST 2010
On 7/27/2010 1:18 PM, Anders J. Munch wrote:
> But suppose you could address the source instead? Suppose you could
> write yield_if_true in such a way that it did not become a generator
> despite yielding?
...
> Now the example would work with a slight modifiction:
>
> def yield_if_true(x):
> if x:
> yield_(x)
> yield_if_true(a)
> yield_if_true(b)
>
> The real benefits from a yield_ function come with recursive
> functions.
Except now yield_if_true() is not a generator. So, you have two classes
of "generators" now (top-level/delegated), which breaks all sorts of
things. How would you write izip() with this? You'd have to have a
top-level (yield) version and a delegated (yield_()) version to satisfy
all of the use-cases. I think your yield_() is actually a detriment to
recursive functions. The "yield from" solution is superior in that the
delegated generators are still normal generators to other call sites
that are indifferent to that use case.
I feel that there is no escaping that "for v in g: yield g" and small
variations are an amazingly common pattern that are amazingly naive.
Although for many use cases, it works just fine; the unfortunate
side-effect is that anyone building more clever generators on-top find
themselves victimized by other authors. Creating a "yield from" syntax
gives the other authors a pleasant and explicit shorthand, and provides
for the other use cases automatically.
> I'm guessing
> you could implement 'yield from' as a pure-Python
> function using yield_, making yield_ strictly more powerful
PEP 380 already provides a pure python description of "yield from" using
existing syntax, therefore the assertion that you could implement it
using yield_() provides no measure for how "powerful" your suggestion is.
--
Scott Dial
scott at scottdial.com
scodial at cs.indiana.edu
More information about the Python-ideas
mailing list