How to get all named args in a dict?

kj socyl at 987jk.com.invalid
Thu May 14 22:15:26 CEST 2009


In <mailman.158.1242328059.8015.python-list at python.org> Dave Angel <davea at ieee.org> writes:



>kj wrote:
>> In <mailman.113.1242254593.8015.python-list at python.org> Terry Reedy <tjreedy at udel.edu> writes:
>>
>>   
>>> kj wrote:
>>>     
>>>> Suppose I have the following:
>>>>
>>>> def foo(x=None, y=None, z=None):
>>>>     d = {"x": x, "y": y, "z": z}
>>>>     return bar(d)
>>>>
>>>> I.e. foo takes a whole bunch of named arguments and ends up calling
>>>> a function bar that takes a single dictionary as argument, and this
>>>> dictionary has the same keys as in foo's signature, so to speak.
>>>>
>>>> Is there some builtin variable that would be the same as the variable
>>>> d, and would thus obviate the need to explicitly bind d?
>>>>       
>>
>>   
>>> Use the built-in function locals()
>>>     
>>>>>> def f(a,b):
>>>>>>           
>>> 	x=locals()
>>> 	print(x)
>>>     
>>
>>   
>>>>>> f(1,2)
>>>>>>           
>>> {'a': 1, 'b': 2}
>>>     
>>
>> That's *exactly* what I was looking for.  Thanks!
>>
>> kynn
>>
>>
>>   
>You already had a better answer from Chris Rebert:

>def foo(**kwargs):
>    return bar(kwargs)

>kwargs at this point is exactly a dictionary of the named arguments to foo.

I disagree.  If I defined foo as you show above, then there is no
error checking on the named parameters passed to foo; anything
goes.

>Because if you try to do anything in this function, you'll probably be 
>adding more local variables. And then they'd be passed to bar as well.

That problem is easily solved: just make "x = locals()" the first
statement in the definition of foo.

kynn
-- 
NOTE: In my address everything before the first period is backwards;
and the last period, and everything after it, should be discarded.



More information about the Python-list mailing list