Kaydet (Commit) bea3f6f5 authored tarafından Raymond Hettinger's avatar Raymond Hettinger

Bug #1163325: "special" decimals aren't hashable

üst 141f41ae
...@@ -728,6 +728,10 @@ class Decimal(object): ...@@ -728,6 +728,10 @@ class Decimal(object):
# Decimal integers must hash the same as the ints # Decimal integers must hash the same as the ints
# Non-integer decimals are normalized and hashed as strings # Non-integer decimals are normalized and hashed as strings
# Normalization assures that hast(100E-1) == hash(10) # Normalization assures that hast(100E-1) == hash(10)
if self._is_special:
if self._isnan():
raise TypeError('Cannot hash a NaN value.')
return hash(str(self))
i = int(self) i = int(self)
if self == Decimal(i): if self == Decimal(i):
return hash(i) return hash(i)
......
...@@ -811,6 +811,9 @@ class DecimalUsabilityTest(unittest.TestCase): ...@@ -811,6 +811,9 @@ class DecimalUsabilityTest(unittest.TestCase):
hash(Decimal(23)) hash(Decimal(23))
#the same hash that to an int #the same hash that to an int
self.assertEqual(hash(Decimal(23)), hash(23)) self.assertEqual(hash(Decimal(23)), hash(23))
self.assertRaises(TypeError, hash, Decimal('NaN'))
self.assert_(hash(Decimal('Inf')))
self.assert_(hash(Decimal('-Inf')))
def test_min_and_max_methods(self): def test_min_and_max_methods(self):
......
...@@ -86,6 +86,9 @@ Extension Modules ...@@ -86,6 +86,9 @@ Extension Modules
Library Library
------- -------
- Bug #1163325: Decimal infinities failed to hash. Attempting to
hash a NaN raised an InvalidOperation instead of a TypeError.
- Patch #918101: Add tarfile open mode r|* for auto-detection of the - Patch #918101: Add tarfile open mode r|* for auto-detection of the
stream compression; add, for symmetry reasons, r:* as a synonym of r. stream compression; add, for symmetry reasons, r:* as a synonym of r.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment