object
instead, but the point is that I've wanted to have data structure in Python that would allow me this:
>>> d = MagicDict({1: {2: 3}}) >>> d.a.b.c.d = "magic!" >>> import json; print json.dumps(d, indent=2) { "a": { "b": { "c": { "d": "magic!" } } }, "1": { "2": 3 } } >>>
Actually this small experiment inspired by DotDict found in pyes project.
So to make myself happy, I've bred DotDict
and defaultdict
to complete the picture:
from collections import defaultdict class DefaultDotDict(defaultdict): def __init__(self, *args, **kwargs): super(DefaultDotDict, self).__init__(DefaultDotDict) if args or kwargs: dict.__init__(self, *args, **kwargs) def __getattr__(self, attr): if attr.startswith('_'): raise AttributeError # Magic only works for key that do not start with "_" val = self.__getitem__(attr) if isinstance(val, dict) and not isinstance(val, DefaultDotDict): val = DefaultDotDict(val) self[attr] = val return val def __setattr__(self, attr, val): return self.__setitem__(attr, val) def __delattr__(self, attr): return self.__delitem__(attr) def __deepcopy__(self, memo): return DefaultDotDict( [(copy.deepcopy(k, memo), copy.deepcopy(v, memo)) for k, v in self.items()])
No comments:
Post a Comment