assymetry between a == b and a.__eq__(b) (WAS: pre-PEP generic objects)
Steven Bethard
steven.bethard at gmail.com
Wed Dec 1 11:27:13 EST 2004
Peter Otten wrote:
> Steven Bethard wrote:
>
>>def __eq__(self, other):
>> """x.__eq__(y) <==> x == y"""
>> return (isinstance(other, self.__class__)
>> and self.__dict__ == other.__dict__)
>
>
> This results in an asymmetry:
>
>>>>from bunch import Bunch
>>>>class B(Bunch): pass
> ...
>>>>B().__eq__(Bunch())
> False
>>>>Bunch().__eq__(B())
> True
>
> With indirect use of __eq__() this puzzling behaviour disappears:
>
>>>>B() == Bunch()
> False
>>>>Bunch() == B()
> False
>
> Whether this is intended, I don't know. If someone can enlighten me...
It does look like it's at least documented:
http://docs.python.org/ref/comparisons.html
"The operators <, >, ==, >=, <=, and != compare the values of two
objects. The objects need not have the same type. If both are numbers,
they are converted to a common type. Otherwise, objects of different
types always compare unequal, and are ordered consistently but arbitrarily."
This sounds like using "==" makes a guarantee that objects of different
types will compare unequal, while my __eq__ method (using isinstance)
did not make this guarantee.
I tried to check the C code to verify this (that different classes are
guaranteed to be unequal) but rich comparisons make that code pretty
complicated.
Steve
More information about the Python-list
mailing list