[Python-ideas] return value of yield expressions
Guido van Rossum
guido at python.org
Tue Sep 13 19:26:34 CEST 2011
On Tue, Sep 13, 2011 at 8:57 AM, Jacob Holm <jh at improva.dk> wrote:
> On 2011-09-13 17:09, H. Krishnan wrote:
>>
>>
>>> You need to be able to use "var1 = yield var2" in the generator
>>> independent on what send is called with, or you can't wrap a generator
>>> using another generator (different ways of doing that was a large part
>>> of the PEP380 discussion).
>>>
>>> So what should "var1" be in each of the following cases?
>>>
>>> g.send() # currently illegal
>>> g.send(None) # None
>>> g.send((), {}) # currently illegal
>>> g.send(((), {})) # ((), {})
>>>
>>> I suppose you could change it so passing exactly one argument did
>>> something different from passing zero or multiple arguments, but then
>>> you have a problem distinguishing when you actually want to use the
>>> value in the other end.
>>>
>>
>> Let us consider from a function point of view:
>> If suppose there was no support for *args and **kwds and you wrote:
>> def func(a):
>> do_something_with_a
>> and this was called with:
>> func((1,2))
>>
>> and subsequently, *args, **kwds support was added to functions, will
>> anything related to 'func' need to change?
>
> I think I get your point. I don't think you are getting mine.
>
> Consider this example:
>
> def foo():
> *(a, b) = yield
What did you mean here? It is not valid syntax. It says
SyntaxError: starred assignment target must be in a list or tuple
> f = foo()
> next(f)
> f.send(1, 2) # Ok
>
> def wrapper(g):
> r = next(g)
> while 1:
> args = (yield r)
> r = g.send(args) # BOOM!
>
> f = wrapper(foo())
> next(f)
> f.send(1, 2) # BOOM!
>
>
> That wrapper works today, and does nothing (except messing up throw
> handling, but that is a different story). With your suggested change,
> such a wrapper would break unless it was changed to use
>
> *(*args, **kwargs) = (yield r)
>
> instead. IOW a backwards incompatible change.
What on earth would **kwds in a list/tuple unpack mean?
--
--Guido van Rossum (python.org/~guido)
More information about the Python-ideas
mailing list