<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div class="h5"><br>
</div></div>You're correct, this is trivial with object_hook.<br>
<div class="im"><br>
>>> class AttrDict(dict):<br>
... def __getattr__(self, attr):<br>
</div>... try:<br>
... return self[attr]<br>
... except KeyError:<br>
... raise AttributeError(attr)<br>
...<br>
>>> import json<br>
>>> obj = json.loads('{"foo": {"bar": "baz"}}', object_hook=AttrDict)<br>
{u'foo': {u'bar': u'baz'}}<br>
>>> obj.foo.bar<br>
u'baz'<br>
<font color="#888888"><br>
-bob<br>
</font></blockquote></div><br><div>That's pretty good, but it does clone the dict unnecessarily. I prefer:</div><div><br></div><div>class AttrDict(object):</div><div> def __init__(self, adict):</div><div> self.__dict__ = adict #a reference, not a copy</div>
<div> def __getattr__(self, attr):</div><div> if hasattr(dict, attr): #built-in methods of dict...</div><div> return getattr(self.__dict__, attr) #...are bound directly to the dict</div><div> else:</div><div>
try:</div>
<div> return self.__dict__[attr]</div><div> except KeyError:</div><div> raise AttributeError(attr)</div><div><br></div><div><br></div><div> </div><div><br></div>