Aahz wrote: > In article <gt8v37$kib$0...@news.t-online.com>, > Peter Otten <__pete...@web.de> wrote: >>Aahz wrote: >>> In article <gt1kb7$jqg$0...@news.t-online.com>, >>> Peter Otten <__pete...@web.de> wrote: >>>> >>>>Here's a trick to find the actual element. I think Raymond Hettinger >>>>posted an implementation of this idea recently, but I can't find it at >>>>the moment. >>> >>> Your code is inverted from Raymond's: >> >>I can't see the inversion. > > You were wrapping the objects inserted into the set; Raymond's trick > involved only wrapping the comparison object. It's therefore much more > convenient.
I think you are misreading my code. I took the items (of class X) as they were specified by the OP. The reason I changed their __eq__() method is not that I did not understand Raymond's trick, but rather a quirk in the set's item lookup: >>> class A(object): ... def __init__(self, value): ... self.value = value ... def __hash__(self): ... return hash(self.value) ... def __eq__(self, other): ... return self.value == other.value ... >>> item = A("a") >>> container = map(A, "abc") >>> from get_equivalent import get_equivalent TestResults(failed=0, attempted=0) get_equivalent() is Raymond's implementation from the recipe. Let's try it: >>> get_equivalent(container, item) <__main__.A object at 0x2091e50> >>> _ is not item True Works. Now the same with a set: >>> container = set(container) >>> print get_equivalent(container, item) None Oops. wanted in some_list performs wanted.__eq__(candidate) where candidate is an item in the list. wanted in some_set tries candidate.__eq__(wanted) first. You must ensure that this fails in an orderly manner for wanted.__eq__(candidate) to be tried at all: >>> def __eq__(self, other): ... if not isinstance(other, A): ... return NotImplemented ... return self.value == other.value ... >>> A.__eq__ = __eq__ >>> print get_equivalent(container, item) <__main__.A object at 0x2091e50> >>> _ is not item True Peter -- http://mail.python.org/mailman/listinfo/python-list