mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
bpo-43475: Fix the Python implementation of hash of Decimal NaN (GH-26679)
(cherry picked from commit 9f1c5f6e8a)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
parent
4becc569a6
commit
128899d8b8
4 changed files with 36 additions and 10 deletions
|
|
@ -1814,13 +1814,7 @@ def hashit(d):
|
|||
|
||||
# check that hash(d) == hash(int(d)) for integral values
|
||||
for value in test_values:
|
||||
self.assertEqual(hashit(value), hashit(int(value)))
|
||||
|
||||
#the same hash that to an int
|
||||
self.assertEqual(hashit(Decimal(23)), hashit(23))
|
||||
self.assertRaises(TypeError, hash, Decimal('sNaN'))
|
||||
self.assertTrue(hashit(Decimal('Inf')))
|
||||
self.assertTrue(hashit(Decimal('-Inf')))
|
||||
self.assertEqual(hashit(value), hash(int(value)))
|
||||
|
||||
# check that the hashes of a Decimal float match when they
|
||||
# represent exactly the same values
|
||||
|
|
@ -1829,7 +1823,7 @@ def hashit(d):
|
|||
for s in test_strings:
|
||||
f = float(s)
|
||||
d = Decimal(s)
|
||||
self.assertEqual(hashit(f), hashit(d))
|
||||
self.assertEqual(hashit(d), hash(f))
|
||||
|
||||
with localcontext() as c:
|
||||
# check that the value of the hash doesn't depend on the
|
||||
|
|
@ -1850,6 +1844,19 @@ def hashit(d):
|
|||
x = 1100 ** 1248
|
||||
self.assertEqual(hashit(Decimal(x)), hashit(x))
|
||||
|
||||
def test_hash_method_nan(self):
|
||||
Decimal = self.decimal.Decimal
|
||||
self.assertRaises(TypeError, hash, Decimal('sNaN'))
|
||||
value = Decimal('NaN')
|
||||
self.assertEqual(hash(value), object.__hash__(value))
|
||||
class H:
|
||||
def __hash__(self):
|
||||
return 42
|
||||
class D(Decimal, H):
|
||||
pass
|
||||
value = D('NaN')
|
||||
self.assertEqual(hash(value), object.__hash__(value))
|
||||
|
||||
def test_min_and_max_methods(self):
|
||||
Decimal = self.decimal.Decimal
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue