AttrDict
May 29, 2006

A dictionary that can be accessed with the attribute notation, as well as the item notation: using AttrDict, a.b is the same as a["b"]. Also, iterating over an AttrDict yields (key, value) pairs (instead of only keys, as in dicts).

Note, however, that because of the unification of getattr and getitem, you cannot access the type’s methods, such as get or keys. You can however use the more explicit notation - AttrDict.<<method>>(<<instance>>, params...).

code

#
# module AttrDict.py
#
class AttrDict(dict):
    __slots__ = []
    
    def __delattr__(self, name):
        try:
            del self[name]
        except KeyError:
            raise AttributeError(name)
    
    def __getattribute__(self, name):
        try:
            return self[name]
        except KeyError:
            raise AttributeError(name)
    
    __setattr__ = dict.__setitem__
    __iter__ = dict.iteritems

Example

>>> d = AttrDict()
>>> d
{}
>>> d2 = AttrDict(a=1,b=2)
>>> d2
{'a': 1, 'b': 2}
>>> d.x = 5
>>> d.x
5
>>> d["x"]
5
>>> d["y"] = 7
>>> d
{'y': 7, 'x': 5}
>>>
>>> for k, v in d:
...     print k, "=", v
...
y = 7
x = 5
>>>
>>>
>>>
>>> d.blah = "yada"
>>> d.another_blah = "yada"
>>> d
{'y': 7, 'x': 5, 'blah': 'yada', 'another_blah' : 'yada'}
>>> del d.blah
>>> del d["another_blah"]
>>> d
{'y': 7, 'x': 5}
>>>
>>>
>>>
>>> # this is NOT going to work...
...
>>> d.keys()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 14, in __getattribute__
AttributeError: keys
>>>
>>>
>>> # instead, you'll need to do
...
>>> AttrDict.keys(d)
['y', 'x']
>>>
>>>
>>> AttrDict.update(d, d2)
>>> d
{'y': 7, 'x': 5, 'b': 2, 'a': 1}
>>>