]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue 3285: Fractions from_float() and from_decimal() accept Integral arguments.
authorRaymond Hettinger <python@rcn.com>
Thu, 10 Jul 2008 14:34:57 +0000 (14:34 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 10 Jul 2008 14:34:57 +0000 (14:34 +0000)
Lib/fractions.py
Lib/test/test_fractions.py
Misc/NEWS

index 6bde7746b8ecbf7a8a70fbfd8bbb86346fcfeb7f..4adb184a9eeaace3c7bb642468b7e20f9cd4b91e 100755 (executable)
@@ -110,7 +110,9 @@ class Fraction(Rational):
         Beware that Fraction.from_float(0.3) != Fraction(3, 10).
 
         """
-        if not isinstance(f, float):
+        if isinstance(f, numbers.Integral):
+            f = float(f)
+        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):
@@ -121,7 +123,9 @@ class Fraction(Rational):
     def from_decimal(cls, dec):
         """Converts a finite Decimal instance to a rational number, exactly."""
         from decimal import Decimal
-        if not isinstance(dec, Decimal):
+        if isinstance(dec, numbers.Integral):
+            dec = Decimal(int(dec))
+        elif not isinstance(dec, Decimal):
             raise TypeError(
                 "%s.from_decimal() only takes Decimals, not %r (%s)" %
                 (cls.__name__, dec, type(dec).__name__))
index d61294fe48dab09e140a46e03156a4fc8ff46725..979fef75cdf725e9306ed164013ce1a463472fb3 100644 (file)
@@ -137,10 +137,8 @@ class FractionTest(unittest.TestCase):
         self.assertNotEquals(F(4, 2), r)
 
     def testFromFloat(self):
-        self.assertRaisesMessage(
-            TypeError, "Fraction.from_float() only takes floats, not 3 (int)",
-            F.from_float, 3)
-
+        self.assertRaises(TypeError, F.from_float, 3+4j)
+        self.assertEquals((10, 1), _components(F.from_float(10)))
         self.assertEquals((0, 1), _components(F.from_float(-0.0)))
         self.assertEquals((10, 1), _components(F.from_float(10.0)))
         self.assertEquals((-5, 2), _components(F.from_float(-2.5)))
@@ -164,10 +162,8 @@ class FractionTest(unittest.TestCase):
             F.from_float, nan)
 
     def testFromDecimal(self):
-        self.assertRaisesMessage(
-            TypeError,
-            "Fraction.from_decimal() only takes Decimals, not 3 (int)",
-            F.from_decimal, 3)
+        self.assertRaises(TypeError, F.from_decimal, 3+4j)
+        self.assertEquals(F(10, 1), F.from_decimal(10))
         self.assertEquals(F(0), F.from_decimal(Decimal("-0")))
         self.assertEquals(F(5, 10), F.from_decimal(Decimal("0.5")))
         self.assertEquals(F(5, 1000), F.from_decimal(Decimal("5e-3")))
index 557af26f3ebfa812691072bff9c9c0bbc3d356ff..faf7e1319b885c39499a01a9e2f4e99249000c37 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -41,6 +41,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #3285: Fractions from_float() and from_decimal() accept Integral arguments.
+
 - Issue #3301: Bisect module modules behaved badly when lo was negative.
 
 - Issue #839496: SimpleHTTPServer used to open text files in text mode. This is