diff --git a/Lib/decimal.py b/Lib/decimal.py index 4108fb8901e2..43244308c0a7 100644 --- a/Lib/decimal.py +++ b/Lib/decimal.py @@ -1512,10 +1512,9 @@ def __int__(self): """Converts self to an int, truncating if necessary.""" if self._is_special: if self._isnan(): - context = getcontext() - return context._raise_error(InvalidContext) + raise ValueError("Cannot convert NaN to integer") elif self._isinfinity(): - raise OverflowError("Cannot convert infinity to int") + raise OverflowError("Cannot convert infinity to integer") s = (-1)**self._sign if self._exp >= 0: return s*int(self._int)*10**self._exp diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py index 79b6a8563d99..c671d7ba3d31 100644 --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -1372,6 +1372,16 @@ def test_int(self): r = d.to_integral(ROUND_DOWN) self.assertEqual(Decimal(int(d)), r) + self.assertRaises(ValueError, int, Decimal('-nan')) + self.assertRaises(ValueError, int, Decimal('snan')) + self.assertRaises(OverflowError, int, Decimal('inf')) + self.assertRaises(OverflowError, int, Decimal('-inf')) + + self.assertRaises(ValueError, long, Decimal('-nan')) + self.assertRaises(ValueError, long, Decimal('snan')) + self.assertRaises(OverflowError, long, Decimal('inf')) + self.assertRaises(OverflowError, long, Decimal('-inf')) + def test_trunc(self): for x in range(-250, 250): s = '%0.2f' % (x / 100.0) diff --git a/Misc/NEWS b/Misc/NEWS index 3162b5a90305..c44a56d75cc9 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -74,6 +74,10 @@ Core and Builtins Library ------- +- Issue #6795: int(Decimal('nan')) now raises ValueError instead of + returning NaN or raising InvalidContext. Also, fix infinite recursion + in long(Decimal('nan')). + - Issue #6850: Fix bug in Decimal._parse_format_specifier for formats with no type specifier.