[Python-checkins] cpython (merge default -> default): merge

brett.cannon python-checkins at python.org
Thu Nov 15 22:16:59 CET 2012


http://hg.python.org/cpython/rev/c7bd9633cb8b
changeset: 80449:c7bd9633cb8b
parent: 80448:901002834a68
parent: 80446:a2b54b6d9759
user: Brett Cannon <brett at python.org>
date: Thu Nov 15 16:13:00 2012 -0500
summary:
 merge
files:
 Lib/fractions.py | 14 +++++++----
 Lib/test/test_fractions.py | 32 ++++++++++++++-----------
 Misc/NEWS | 4 +++
 3 files changed, 31 insertions(+), 19 deletions(-)
diff --git a/Lib/fractions.py b/Lib/fractions.py
--- a/Lib/fractions.py
+++ b/Lib/fractions.py
@@ -182,8 +182,10 @@
 elif not isinstance(f, float):
 raise TypeError("%s.from_float() only takes floats, not %r (%s)" %
 (cls.__name__, f, type(f).__name__))
- if math.isnan(f) or math.isinf(f):
- raise TypeError("Cannot convert %r to %s." % (f, cls.__name__))
+ if math.isnan(f):
+ raise ValueError("Cannot convert %r to %s." % (f, cls.__name__))
+ if math.isinf(f):
+ raise OverflowError("Cannot convert %r to %s." % (f, cls.__name__))
 return cls(*f.as_integer_ratio())
 
 @classmethod
@@ -196,9 +198,11 @@
 raise TypeError(
 "%s.from_decimal() only takes Decimals, not %r (%s)" %
 (cls.__name__, dec, type(dec).__name__))
- if not dec.is_finite():
- # Catches infinities and nans.
- raise TypeError("Cannot convert %s to %s." % (dec, cls.__name__))
+ if dec.is_infinite():
+ raise OverflowError(
+ "Cannot convert %s to %s." % (dec, cls.__name__))
+ if dec.is_nan():
+ raise ValueError("Cannot convert %s to %s." % (dec, cls.__name__))
 sign, digits, exp = dec.as_tuple()
 digits = int(''.join(map(str, digits)))
 if sign:
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
--- a/Lib/test/test_fractions.py
+++ b/Lib/test/test_fractions.py
@@ -146,9 +146,10 @@
 self.assertEqual((0, 1), _components(F(-0.0)))
 self.assertEqual((3602879701896397, 36028797018963968),
 _components(F(0.1)))
- self.assertRaises(TypeError, F, float('nan'))
- self.assertRaises(TypeError, F, float('inf'))
- self.assertRaises(TypeError, F, float('-inf'))
+ # bug 16469: error types should be consistent with float -> int
+ self.assertRaises(ValueError, F, float('nan'))
+ self.assertRaises(OverflowError, F, float('inf'))
+ self.assertRaises(OverflowError, F, float('-inf'))
 
 def testInitFromDecimal(self):
 self.assertEqual((11, 10),
@@ -157,10 +158,11 @@
 _components(F(Decimal('3.5e-2'))))
 self.assertEqual((0, 1),
 _components(F(Decimal('.000e20'))))
- self.assertRaises(TypeError, F, Decimal('nan'))
- self.assertRaises(TypeError, F, Decimal('snan'))
- self.assertRaises(TypeError, F, Decimal('inf'))
- self.assertRaises(TypeError, F, Decimal('-inf'))
+ # bug 16469: error types should be consistent with decimal -> int
+ self.assertRaises(ValueError, F, Decimal('nan'))
+ self.assertRaises(ValueError, F, Decimal('snan'))
+ self.assertRaises(OverflowError, F, Decimal('inf'))
+ self.assertRaises(OverflowError, F, Decimal('-inf'))
 
 def testFromString(self):
 self.assertEqual((5, 1), _components(F("5")))
@@ -248,14 +250,15 @@
 
 inf = 1e1000
 nan = inf - inf
+ # bug 16469: error types should be consistent with float -> int
 self.assertRaisesMessage(
- TypeError, "Cannot convert inf to Fraction.",
+ OverflowError, "Cannot convert inf to Fraction.",
 F.from_float, inf)
 self.assertRaisesMessage(
- TypeError, "Cannot convert -inf to Fraction.",
+ OverflowError, "Cannot convert -inf to Fraction.",
 F.from_float, -inf)
 self.assertRaisesMessage(
- TypeError, "Cannot convert nan to Fraction.",
+ ValueError, "Cannot convert nan to Fraction.",
 F.from_float, nan)
 
 def testFromDecimal(self):
@@ -268,17 +271,18 @@
 self.assertEqual(1 - F(1, 10**30),
 F.from_decimal(Decimal("0." + "9" * 30)))
 
+ # bug 16469: error types should be consistent with decimal -> int
 self.assertRaisesMessage(
- TypeError, "Cannot convert Infinity to Fraction.",
+ OverflowError, "Cannot convert Infinity to Fraction.",
 F.from_decimal, Decimal("inf"))
 self.assertRaisesMessage(
- TypeError, "Cannot convert -Infinity to Fraction.",
+ OverflowError, "Cannot convert -Infinity to Fraction.",
 F.from_decimal, Decimal("-inf"))
 self.assertRaisesMessage(
- TypeError, "Cannot convert NaN to Fraction.",
+ ValueError, "Cannot convert NaN to Fraction.",
 F.from_decimal, Decimal("nan"))
 self.assertRaisesMessage(
- TypeError, "Cannot convert sNaN to Fraction.",
+ ValueError, "Cannot convert sNaN to Fraction.",
 F.from_decimal, Decimal("snan"))
 
 def testLimitDenominator(self):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -127,6 +127,10 @@
 Library
 -------
 
+- Issue #16469: Fix exceptions from float -> Fraction and Decimal -> Fraction
+ conversions for special values to be consistent with those for float -> int
+ and Decimal -> int. Patch by Alexey Kachayev.
+
 - Issue #16481: multiprocessing no longer leaks process handles on Windows.
 
 - Issue #12428: Add a pure Python implementation of functools.partial().
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /