On Wed, Feb 4, 2015 at 9:50 AM, Travis Griggs <travisgri...@gmail.com> wrote: > I really like pymongo. And I really like Python. But one thing my fingers > really get tired of typing is > > someDoc[‘_’id’] > > This just does not roll of the fingers well. Too many “reach for modifier > keys” in a row. I would rather use > > someDoc._id > > Googling shows that I’m not the first to want to do this in the general sense > (e.g. > http://stackoverflow.com/questions/4984647/accessing-dict-keys-like-an-attribute-in-python). > > Arguments aside of whether this should or shouldn’t be done, I want to know > how I might solve this with Python. Consider it an academic pursuit. > > The problem I have is not how to do the AttributeDictionary subclass, there > are plenty of those examples. The problem is that the pymongo APIs already > return dictionaries. In a language (Smalltalk, Objective-C, Ruby) that > supports class extensions, that would be my first tool of choice to solve > this problem. I’d just extend Dictionary to behave the way I want and be done > with it. I can’t do that in Python though. I guess I could make my own module > that subclasses the relevant pymongo classes, and do super() calling > implementations of all of the relevant methods, coercing the return type. > That is a maintenance headache though. > > What are my options, if any?
You could construct the AttributeDictionary by copying the dict returned from pymongo. The question then is whether the copying would be too expensive or not. Alternately, you could just wrap the dictionaries returned by pymongo in an object. Something like this should be all you need: class AttrDictWrapper(object): def __init__(self, the_dict): self.__dict__ = the_dict >>> d = AttrDictWrapper({'spam': 42, 'ham': False}) >>> d.spam 42 >>> d.ham False -- https://mail.python.org/mailman/listinfo/python-list