[Python-Dev] Python's C interface for types
Jim Jewett
jimjjewett at gmail.com
Thu Feb 1 00:50:35 CET 2007
Nick Maclaren wrote:
> Martin v. Löwis wrote:
>> It may be a bit problematic to implement, but I think a clean
>> specification is possible. If a and b are numbers, and a==b,
>> then hash(a)==hash(b).
You don't even need that much complication.
If a==b, then hash(a) == hash(b)
If you have to break this, then at least one (preferably both) of
(a,b) must be unhashable, so that it won't get used as a dict key.
Hashing is only ever meaningful as a shortcut to quickly show that two
objects are *not* equal.
>> I'm not sure whether "approximately 5.0"
>> equals 5 or not: if it does, it should hash the same as 5,
>> if it doesn't, it may or may not hash the same (whatever is
>> easier to implement).
agreed.
>> For 0: hash(+0.0)==hash(-0.0)==hash(0)=hash(0L)=0
> Unfortunately, that assumes that equality is transitive.
No, but the (transitively closed set of equivalent objects) must have
the same hash. If
>>> myfloat(5.0) != 5.0
True
then you could just return 47 as the hash. It might not be terribly
efficient, but it would work.
If
>>> myfloat_exact(5.0) == 5.0 == myfloat_approx(5.0) != myfloat_exact(5.0)
then at least one of (myfloat_exact, myfloat_approx) needs to be
unhashable, so that it can't be used as a dictionary key.
> let us say that I am implementing a special function and want to
> distinguish -0.0 and +0.0. Why can't I use a dictionary?
Because they are equal. They aren't identical, but they are equal.
> >>> a = float("+0.0")
> >>> b = float("-0.0")
> >>> print a, b
> 0.0 -0.0
With the standard windows distribution, I get just
0.0 0.0
> No, I don't have an answer. You are damned if you do, and damned
> if you don't. It is an insoluble problem, and CURRENTLY doesn't
> justify two hashing mechanisms (i.e. ANY difference and EQUALITY
> difference).
You want something in between "__eq__" and "is". (a.identical(b) ?)
Hashing is weaker than either.
>>> hash ("JimJ") == hash (2010274390)
True
-jJ
More information about the Python-Dev
mailing list