mirror of
https://github.com/python/cpython.git
synced 2025-10-23 07:02:24 +00:00
Make Fraction(-1).__hash__() return -2 rather than -1 (see issue 10356).
This commit is contained in:
parent
24854cac99
commit
fec6620dfb
3 changed files with 9 additions and 6 deletions
|
@ -528,12 +528,8 @@ class Fraction(numbers.Rational):
|
||||||
return Fraction(round(self / shift) * shift)
|
return Fraction(round(self / shift) * shift)
|
||||||
|
|
||||||
def __hash__(self):
|
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
|
# XXX since this method is expensive, consider caching the result
|
||||||
|
|
||||||
# In order to make sure that the hash of a Fraction agrees
|
# In order to make sure that the hash of a Fraction agrees
|
||||||
|
@ -550,7 +546,8 @@ class Fraction(numbers.Rational):
|
||||||
hash_ = _PyHASH_INF
|
hash_ = _PyHASH_INF
|
||||||
else:
|
else:
|
||||||
hash_ = abs(self._numerator) * dinv % _PyHASH_MODULUS
|
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):
|
def __eq__(a, b):
|
||||||
"""a == b"""
|
"""a == b"""
|
||||||
|
|
|
@ -546,6 +546,9 @@ class FractionTest(unittest.TestCase):
|
||||||
self.assertEquals(hash(2.5), hash(F(5, 2)))
|
self.assertEquals(hash(2.5), hash(F(5, 2)))
|
||||||
self.assertEquals(hash(10**50), hash(F(10**50)))
|
self.assertEquals(hash(10**50), hash(F(10**50)))
|
||||||
self.assertNotEquals(hash(float(10**23)), hash(F(10**23)))
|
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):
|
def testApproximatePi(self):
|
||||||
# Algorithm borrowed from
|
# Algorithm borrowed from
|
||||||
|
|
|
@ -63,6 +63,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Fix Fraction.__hash__ so that Fraction.__hash__(-1) is -2. (See
|
||||||
|
also issue #10356.)
|
||||||
|
|
||||||
- Issue #4471: Add the IMAP.starttls() method to enable encryption on
|
- Issue #4471: Add the IMAP.starttls() method to enable encryption on
|
||||||
standard IMAP4 connections. Original patch by Lorenzo M. Catucci.
|
standard IMAP4 connections. Original patch by Lorenzo M. Catucci.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue