[Python-Dev] Getting values stored inside sets

R. David Murray rdmurray at bitdance.com
Fri Apr 3 19:33:39 CEST 2009


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


More information about the Python-Dev mailing list