namespace dictionaries ok?
Ron Adam
rrr at ronadam.com
Tue Oct 25 02:07:17 EDT 2005
James Stroud wrote:
> Oops. Answered before I finished reading the question.
>
> James
Well, the one bad side effect (or feature depending on the
circumstance), is it makes a copy. I wonder if there is a way to modify
the dictionary in place with a function to do the same thing instead of
creating a new object?
Cheers,
Ron
> On Monday 24 October 2005 19:53, Ron Adam wrote:
>
>>James Stroud wrote:
>>
>>>Here it goes with a little less overhead:
>>>
>>>
>>>py> class namespace:
>>>... def __init__(self, adict):
>>>... self.__dict__.update(adict)
>>>...
>>>py> n = namespace({'bob':1, 'carol':2, 'ted':3, 'alice':4})
>>>py> n.bob
>>>1
>>>py> n.ted
>>>3
>>>
>>>James
>>
>>But it's not a dictionary anymore so you can't use it in the same places
>>you would use a dictionary.
>>
>> foo(**n)
>>
>>Would raise an error.
>>
>>So I couldn't do:
>>
>> def foo(**kwds):
>> kwds = namespace(kwds)
>> kwds.bob = 3
>> kwds.alice = 5
>> ...
>> bar(**kwds) #<--- do something with changed items
>>
>>Ron
>>
>>
>>>On Monday 24 October 2005 19:06, Ron Adam wrote:
>>>
>>>>Hi, I found the following to be a useful way to access arguments after
>>>>they are passed to a function that collects them with **kwds.
>>>>
>>>>
>>>> class namespace(dict):
>>>> def __getattr__(self, name):
>>>> return self.__getitem__(name)
>>>> def __setattr__(self, name, value):
>>>> self.__setitem__(name, value)
>>>> def __delattr__(self, name):
>>>> self.__delitem__(name)
>>>>
>>>> def foo(**kwds):
>>>> kwds = namespace(kwds)
>>>> print kwds.color, kwds.size, kwds.shape etc....
>>>>
>>>> foo( color='red', size='large', shape='ball', .... etc..)
>>>>
>>>>
>>>>It just seems awkward to have to use "string keys" in this situation.
>>>>This is easy and still retains the dictionary so it can be modified and
>>>>passed to another function or method as kwds again.
>>>>
>>>>Any thoughts? Any better way to do this?
>>>>
>>>>Cheers, Ron
>
>
More information about the Python-list
mailing list