D'Arcy J.M. Cain <da...@druid.net> wrote: > On Fri, 19 Jun 2009 13:17:24 -0500 > Amita Ekbote <amita.ekb...@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 <n...@craig-wood.com> -- http://www.craig-wood.com/nick -- http://mail.python.org/mailman/listinfo/python-list