class AttrDict(dict): """A dictionary with attribute-style access. It maps attribute access to the real dictionary. """ def __init__(self, *args, **kwargs): dict.__init__(self, *args, **kwargs) def __getstate__(self): return self.__dict__.items() def __setstate__(self, items): for key, val in items: self.__dict__[key] = val def __repr__(self): return "%s(%s)" % (self.__class__.__name__, dict.__repr__(self)) def __setitem__(self, key, value): return super(AttrDict, self).__setitem__(key, value) def __getitem__(self, name): if name not in super(AttrDict, self).keys(): return None return super(AttrDict, self).__getitem__(name) def __delitem__(self, name): return super(AttrDict, self).__delitem__(name) __getattr__ = __getitem__ __setattr__ = __setitem__ def copy(self): return AttrDict(self)