[Python-ideas] return value of yield expressions

Stefan Behnel stefan_ml at behnel.de
Tue Sep 13 15:00:59 CEST 2011


Jacob Holm, 13.09.2011 14:32:
> On 2011-09-13 14:21, Stefan Behnel wrote:
>> Jacob Holm, 13.09.2011 13:02:
>>> args, kwds = (yield ret)  # any expression really
>>> (a1, a2, a3, *args), kwds = (lambda a1,a2,a3=default,*args, **kwds:
>>>                                (a1,a2,a3)+args, kwds
>>>                               )(*args, **kwds)
>>
>> Note that recent Python versions support extended argument unpacking, so
>> this works:
>>
>>      a1, *other, a2 = return_some_sequence()
>>
>
> If you look closer you'll see I am actually using that feature already
> in the code snippet you quoted.

Ah, ok, I thought you were *proposing* to add this. That happens on 
python-ideas a lot more often than you seem to expect.


>> If you use the last value of the returned sequence (such as a tuple) to
>> pass a dict, or if you return a tuple with two arguments (posargs,
>> kwargdict), you basically get what you wanted above.
>
> basically no.  The suggested "function argument unpacking" includes
> support for default values, and for passing positional arguments by
> name.  Everything that happens when you call a function using (*arg,
> **kwds) really.

Well, I really don't see how this is a wide-spread use case (I certainly 
never stumbled over it), but if you feel like needing it, write a utility 
function that does the unpacking for you in a couple of lines and wrap the 
call with that. I have my doubts that it would make your code much clearer.

Especially default values for keyword dict return values do not appear to 
be any useful to me, given that you'd most likely unpack them one by one 
anyway. So you could just use d.get() with a default argument there, thus 
making it explicit and obvious in your code what is going on.

Stefan




More information about the Python-ideas mailing list