Convert hash to struct

Nick Craig-Wood nick at craig-wood.com
Mon Jun 22 11:29:28 CEST 2009


D'Arcy J.M. Cain <darcy at druid.net> wrote:
>  On Fri, 19 Jun 2009 13:17:24 -0500
>  Amita Ekbote <amita.ekbote at gmail.com> wrote:
> > I am retrieving values from a database in the form of a dictionary so
> > I can access the values as d['column'] and I was wondering if there is
> > a way to convert the hash to a struct like format so i can just say
> > d.column. Makes it easier to read and understand.
> 
>  Are there enough clues here?
> 
>  class MyDict(dict):
>      def __getattribute__(self, name):
>          return dict.__getattribute__(self, name)
> 
>      def __getattr__(self, name):
>          return self.get(name, 42)
> 
>  x = MyDict({'a': 1, 'b': 2, 'values': 3})

That is my preferred solution - subclass dict rather than make a new
type...  I use this a lot for returning results from databases.

Here is a more fleshed out version.  Changing KeyError to
AttributeError is necessary if you want the object to pickle.

class MyDict(dict):
        """
        A dictionary with attribute access also.

        If a builtin dictionary method collides with a member of the
        dictionary, the member function will win.
        """
        def __getattr__(self, name):
            try:
                return super(db_dict, self).__getitem__(name)
            except KeyError:
                raise AttributeError("%r object has no attribute %r" % (self.__class__.__name__, name))

        def __setattr__(self, name, value):
            return super(db_dict, self).__setitem__(name, value)

        def __delattr__(self, name):
            try:
                return super(db_dict, self).__delitem__(name)
            except KeyError:
                raise AttributeError("%r object has no attribute %r" % (self.__class__.__name__, name))

        def copy(self):
            return MyDict(self)

>  print x.a
>  print x.z
>  print x.values
> 
>  Big question - what should the last line display?  If you expect "3"
>  and not "<built-in method values of MyDict object at 0xbb82838c>" then
>  you need to reconsider the above implementation.  Thinking about the
>  question may change your opinion about this being a good idea after
>  all.

Indeed!

-- 
Nick Craig-Wood <nick at craig-wood.com> -- http://www.craig-wood.com/nick



More information about the Python-list mailing list