>
>
> You're correct, this is trivial with object_hook.
>
> >>> class AttrDict(dict):
> ...     def __getattr__(self, attr):
> ...         try:
> ...             return self[attr]
> ...         except KeyError:
> ...             raise AttributeError(attr)
> ...
> >>> import json
> >>> obj = json.loads('{"foo": {"bar": "baz"}}', object_hook=AttrDict)
> {u'foo': {u'bar': u'baz'}}
> >>> obj.foo.bar
> u'baz'
>
> -bob
>

That's pretty good, but it does clone the dict unnecessarily. I prefer:

class AttrDict(object):
  def __init__(self, adict):
    self.__dict__ = adict #a reference, not a copy
  def __getattr__(self, attr):
    if hasattr(dict, attr): #built-in methods of dict...
      return getattr(self.__dict__, attr) #...are bound directly to the dict
    else:
      try:
        return self.__dict__[attr]
      except KeyError:
        raise AttributeError(attr)
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to