Marko Rauhamaa wrote:
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)

I didn't disagree with any of these statements about __hash__, but only
your statement about id and __eq__:

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()

nan is a clear, simple, undeniable counterexample to that claim.

the hash function for floats is quite interesting btw, you may want to
look what is its value for nan.


--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to