On Nov 27, 9:36 pm, "Gabriel Genellina" <gagsl-...@yahoo.com.ar> wrote: > En Fri, 27 Nov 2009 15:12:36 -0300, Francis Carr <coldtort...@gmail.com> > escribió: > > > I was really inspired by this discussion thread! :-) > > > After much tinkering, I think I have a simpler solution. Just make > > the inverse mapping accessible via an attribute, -AND- bind the > > inverse of -THAT- mapping back to the original. The result is a > > python dict with NO NEW METHODS except this inverse-mapping > > attribute. I have posted it on code.activestate.com as <a > > href="http://code.activestate.com/recipes/576968/">Recipe 576968: > > Flipdict -- python dict that also maintains a one-to-one inverse > > mapping</a> > > Nice idea!
Indeed! Thanks for sharing! I liked this so much I added something similar in http://bitbucket.org/jab/toys/src/tip/bidict.py (I made the inverse available via a .inv property, as well as via the unary ~ operator (by analogy to bitwise inverse)). I also got rid of getinv, popinv, et al. to keep the API leaner as you recommend. I've kept the slice syntax though as well as namedbidect, so for now I guess I'm allowing for many ways to skin this cat. > Just a couple of comments: > > Instead of: > self._flip = dict.__new__(self.__class__) > I'd write: > self._flip = self.__class__() > unless I'm missing something (but see the next point). How would this not cause infinite recursion? > Also, although Python's GC is able to handle them, I prefer to avoid > circular references like those between x and x._flip. Making self._flip a > weak reference (and dereferencing it in the property) should be enough. If both self._flip and self._flip._flip are weak references, no strong references to the inverse mapping survive leaving the constructor scope. Unless I'm missing something, only one of these can be a weak reference, and then you'd have to do something like this in the property to prevent "TypeError: FlipDict is not callable": @property def flip(self): try: # we're an inverse, self._flip is a weak reference return self._flip() except TypeError: # we're a forward mapping, self._flip is a strong reference return self._flip -- http://mail.python.org/mailman/listinfo/python-list