
What would this code do: def yield_if_true(x): if x: yield_(x) def maybe_yield(x): if calculate_property(x): yield_if_true(x) else: return None maybe_yield(5) When maybe_yield(5) is called different things need to happen depending on whether it’s a function or a generator. If it’s a generator, it shouldn’t execute calculate_property(x) yet, because generators don’t execute their contents until someone says next(maybe_yield(5)) (or maybe_yield(5).next() in Py2.x). On the other hand, if it’s not a generator but a function, then it should run calculate_property right away. You could try starting out as a function and then switching to being a generator if anything that you call has a call to yield_ inside of it, but that strikes me as extremely clumsy and complicated, and it could lead to unpleasant surprises if calculate_property has side-effects. ISTM there’s no way to do something like PEP-380 without requiring that some special keyword is used to indicate that the def is creating a generator and not creating a function. There other directions to take this besides yield from (for example, we could replace def with gen or some such and give return a special meaning inside a gen statement), but to try to do it without any kind of keyword at the site of the caller means violating "In the face of ambiguity, refuse the temptation to guess.” -- Carl Johnson On Tue, Jul 27, 2010 at 3:19 PM, Greg Ewing <greg.ewing@canterbury.ac.nz> wrote:
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?
I don't see how this would work. The problem isn't that yield_if_true becomes a generator -- it's that the function calling yield_if_true *doesn't* become a generator, even though it needs to.
Let's call it 'yield_' , for lack of a better name. The function would yield the nearest generator on the call stack.
But if none of the calling functions have yields anywhere else, then they're just ordinary functions, and there is *no* generator on the call stack!
-- Greg _______________________________________________ Python-ideas mailing list Python-ideas@python.org http://mail.python.org/mailman/listinfo/python-ideas