Rich comparison methods don't work in sets?
Steven D'Aprano
steve at REMOVETHIS.cybersource.com.au
Sat Jun 20 12:13:04 EDT 2009
Gustavo Narea wrote:
> Hello again, everybody.
>
> Thank you very much for your responses. You guessed right, I didn't
> use the __hash__ method (and I forgot to mention that, sorry).
>
> And unfortunately, I think I can't make them hashable, because the
> objects are compared based on their attributes, which are in turn
> other kind of objects compared based on other attributes. All these
> class instances are compared with __eq__/__ne__ and they wrap
> relatively complex data which would be hard to attempt to represent
> them unambiguously using a 32-bit integer.
There is no need for hash to represent the data unambiguously.
>>> hash(-1)
-2
>>> hash(-2)
-2
>>> hash(2.0**32 - 1)
-2
>>> hash(1)
1
>>> hash(2.0**64 - 1)
1
>>> hash(2.0**64 + 1)
1
>>> hash(2)
2
>>> hash(1+2**32)
2
>>> hash(1+2**64)
2
>>> hash(1+2**128)
2
>>> hash(2.0)
2
The rule is, if x and y are equal, then hash(x) should equal hash(y). This
does NOT imply that if hash(x) == hash(y), then x must equal y, nor is
there any requirement for every unique piece of data to have a unique hash.
--
Steven
More information about the Python-list
mailing list