**kwds behavior?

Bengt Richter bokr at oz.net
Tue Sep 2 23:56:50 EDT 2003


On 2 Sep 2003 07:52:22 -0700, JoeyTaj at netzero.com (Paradox) wrote:

>Why does the following attempts to pass in keywords arguments not
>work. It would be alot cooler if there was a way to not have to have
>the function defined with the variable name. It really seems to me
>that the 3rd function should work. Does anyone know how to accomplish
>something like this.
>def testKeywords1 (**kwds):
>	print x
>	
>def testKeywords2 (**kwds):
>	locals().update(kwds)
>	print x
>		
>def testKeywords3 (**kwds):
>	locals().update(kwds)
>	def testNested():
>		print x
>	testNested()
>	
>dict = {}
>dict['x'] = 5
># doesn't work
>testKeywords1(**dict)
># doesn't work
>testKeywords2(**dict)
># doesn't work
>testKeywords3(**dict)

A couple of other things that might relate to what you want:

 >>> def testkw(**kw):
 ...     exec 'print x' in kw
 ...
 >>> testkw(x='did it work?')
 did it work?

Guess so, but
 >>> testkw(y='did it work?')
 Traceback (most recent call last):
   File "<stdin>", line 1, in ?
   File "<stdin>", line 2, in testkw
   File "<string>", line 1, in ?
 NameError: name 'x' is not defined

Note that that's a NameError, not a KeyError, as in:
 >>> def testkw1(**kw):
 ...     print '%(x)s' % kw
 ...
 >>> testkw1(x='did it work?')
 did it work?

Ok, but
 >>> testkw1(y='did it work?')
 Traceback (most recent call last):
   File "<stdin>", line 1, in ?
   File "<stdin>", line 2, in testkw1
 KeyError: 'x'

Yet another way ...

 >>> def testkw2(**kw):
 ...     ns = type('',(),kw)()
 ...     print ns.x
 ...
 >>> testkw2(x='did it work?')
 did it work?

 >>> testkw2(y='did it work?')
 Traceback (most recent call last):
   File "<stdin>", line 1, in ?
   File "<stdin>", line 3, in testkw2
 AttributeError: '' object has no attribute 'x'

Or silliness,

 >>> def testkw3(**kw):
 ...     exec """
 ... def foo():
 ...     print x
 ... """ in kw
 ...     kw['foo']()
 ...
 >>> testkw3(x='did it work?')
 did it work?

 >>> testkw3(y='did it work?')
 Traceback (most recent call last):
   File "<stdin>", line 1, in ?
   File "<stdin>", line 6, in testkw3
   File "<string>", line 3, in foo
 NameError: global name 'x' is not defined

So what are you actually trying to do?

Regards,
Bengt Richter




More information about the Python-list mailing list