diff options
author | Mark Dickinson <dickinsm@gmail.com> | 2010-11-13 10:27:38 (GMT) |
---|---|---|
committer | Mark Dickinson <dickinsm@gmail.com> | 2010-11-13 10:27:38 (GMT) |
commit | fec6620dfb9b7e99b68c07b623235f87f5fd1a60 (patch) | |
tree | 36c6d0c627256a1dd1efb9d866e232271336d77b /Lib | |
parent | 24854cac996ebe2f534cbe58b141fe51fd2d8d0e (diff) | |
download | cpython-fec6620dfb9b7e99b68c07b623235f87f5fd1a60.zip cpython-fec6620dfb9b7e99b68c07b623235f87f5fd1a60.tar.gz cpython-fec6620dfb9b7e99b68c07b623235f87f5fd1a60.tar.bz2 |
Make Fraction(-1).__hash__() return -2 rather than -1 (see issue 10356).
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/fractions.py | 9 | ||||
-rw-r--r-- | Lib/test/test_fractions.py | 3 |
2 files changed, 6 insertions, 6 deletions
diff --git a/Lib/fractions.py b/Lib/fractions.py index 51e67e2..8be52d2 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -528,12 +528,8 @@ class Fraction(numbers.Rational): return Fraction(round(self / shift) * shift) def __hash__(self): - """hash(self) + """hash(self)""" - Tricky because values that are exactly representable as a - float must have the same hash as that float. - - """ # XXX since this method is expensive, consider caching the result # In order to make sure that the hash of a Fraction agrees @@ -550,7 +546,8 @@ class Fraction(numbers.Rational): hash_ = _PyHASH_INF else: hash_ = abs(self._numerator) * dinv % _PyHASH_MODULUS - return hash_ if self >= 0 else -hash_ + result = hash_ if self >= 0 else -hash_ + return -2 if result == -1 else result def __eq__(a, b): """a == b""" diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index a41fd9c..c28f06c 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -546,6 +546,9 @@ class FractionTest(unittest.TestCase): self.assertEquals(hash(2.5), hash(F(5, 2))) self.assertEquals(hash(10**50), hash(F(10**50))) self.assertNotEquals(hash(float(10**23)), hash(F(10**23))) + # Check that __hash__ produces the same value as hash(), for + # consistency with int and Decimal. (See issue #10356.) + self.assertEquals(hash(F(-1)), F(-1).__hash__()) def testApproximatePi(self): # Algorithm borrowed from |