Python <python@example.invalid>: > Marko Rauhamaa wrote: >> Python <python@example.invalid>: >> >>> Marko Rauhamaa wrote: >>>> id() is actually an ideal return value of __hash__(). The only criterion >>>> is that the returned number should be different if the __eq__() is >>>> False. That is definitely true for id(). >>> >>> $ python >>> Python 2.7.13 (default, Jan 19 2017, 14:48:08) >>> [GCC 6.3.0 20170118] on linux2 >>> Type "help", "copyright", "credits" or "license" for more information. >>>>>> nan = float('NaN') >>>>>> id(nan) == id(nan) >>> True >>>>>> nan == nan >>> False >>>>>> >> >> Point being? > > It is a counter example to your claim that if __eq__(...) is false > then id should return different values.
No it's not: * __hash__() *should* return different values. It is neither possible nor necessary in the general case. * For NaN, there's no better alternative. * Dictionaries and sets try "is" before __eq__(...) so everything works anyway. So, to be precise, the __hash__() rule is: a.__hash__() *should* return a different number than b.__hash__() if a is not b and not a.__eq__(b) a.__hash__() *must* return the same number as b.__hash__() if a is b or a.__eq__(b) Marko -- https://mail.python.org/mailman/listinfo/python-list