[Python-ideas] return value of yield expressions

Georg Brandl g.brandl at gmx.net
Tue Sep 13 19:57:59 CEST 2011


Am 13.09.2011 19:34, schrieb Guido van Rossum:
> On Tue, Sep 13, 2011 at 10:21 AM, H. Krishnan <hetchkay at gmail.com> wrote:
>>> > (a1, a2, a3 = 3, *args, **kwds) = (yield <expr>)
>>>
>>> What on earth is this syntax supposed to mean? Never mind that there's
>>> a yield on the RHS; it is just a parenthesized expression so it could
>>> could be any other function. What on earth do you expect to happen
>>> with the syntax on the left, i.e. with the part
>>
>>
>>>
>>> (a1, a2, a3 = 3, *args, **kwds) = ........whatever........
>>
>> As I said "forgeting the backward compatibility issue".
> 
> It's not a backwards compatibility issue. Maybe I'm dense, but *I do
> not understand what it means in your proposal.*
> 
>> Suppose we use
>> Jacob's syntax (for argument's sake)
> 
>> *(a1, a2, a3 = 3, *args, **kwds) = (yield expr)
> 
>> and with g.send(*a, **k) being called, a1, a2, a3, args, kwds can be
>> inferred using the same semantics that is used to decipher a1, a2, a3, args,
>> kwds in a call to the following function with *a and **k as arguments:
>> def func(a1, a2, a3 = 3, *args, **kwds):
>>    ...
> 
> I still don't follow. Can you show a specific argument list to send,
> e.g. g.send(1, 2, 3, foo='a', bar='b') and then tell me what the
> values of a1, a2, a3, args and kwds will be? And, since
> 
> X = Y
> 
> should always be equivalent to
> 
> tmp = Y
> X = tmp
> 
> can you also tell me what value is supposed to be produced by (yield
> expr)? I.e. if I did this:
> 
> tmp = (yield expr)
> *(a1, a2, a3 = 3, *args, **kwds) = tmp
> 
> what would the value of tmp be?
> 
>> That (yield expr) can be used in expressions does not (I feel) affect this
>> (particularly if we go with Jacob's suggestion of this being a general
>> unpacking option), just in the same way that "a, b, *args, c = <tuple>" does
>> not affect using tuples in expressions. But after reading your comment in
>> another thread about those who don't know how python works should keep
>> quiet, I guess it is best if I end this here :-)
> 
> I understand "a, b, *c = <something>". I do not understand three
> things in your example:
> 
> *(....) = <something>  # What is the meaning of the prefix *?
> 
> *(.... = .....) = <something>  # What does an = inside parentheses mean?
> 
> *(.... = ......, **kwds) = <something>  # What does **kwds mean in this context?
> 

Apparently that syntax would be exclusive for "= yield", which then "unpacks"
the arguments given to generator.send() as if the LHS was the argument list
of a function.

Georg






More information about the Python-ideas mailing list