On Fri, 3 Apr 2009 at 17:57, Paul Moore wrote: > In fact, Python seems to be doing something I don't understand: > >>>> class Element(object): > ... def __init__(self, key, id): > ... self.key = key > ... self.id = id > ... def __eq__(self, other): > ... print "Calling __eq__ for %s" % self.id > ... return self.key == other > ... def __hash__(self): > ... return hash(self.key) > ... >>>> a = Element('k', 'a') >>>> b = Element('k', 'b') >>>> a == b > Calling __eq__ for a > Calling __eq__ for b > True >>>> a == a > Calling __eq__ for a > Calling __eq__ for a > True >>>> > > Why does __eq__ get called twice in these cases? Why does a == b, as > that means a.key == b, and clearly a.key ('k') does *not* equal b. Or > are there some further options being tried, in str,__eq__ or > object.__eq__? The documentation doesn't say so... Specifically, > there's nothing saying that a "reversed" version is tried. a == b So, python calls a.__eq__(b) Now, that function does: a.key == b Since b is an object with an __eq__ method, python calls b.__eq__(a.key). That function does: a.key == b.key ie: the OP's code is inefficient :) --David
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4