From: Raymond Hettinger Date: Thu, 10 Jul 2008 14:34:57 +0000 (+0000) Subject: Issue 3285: Fractions from_float() and from_decimal() accept Integral arguments. X-Git-Tag: v2.6b2~82 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b01713e7dc26721e821a2b3ed8a67600d68940fb;p=thirdparty%2FPython%2Fcpython.git Issue 3285: Fractions from_float() and from_decimal() accept Integral arguments. --- diff --git a/Lib/fractions.py b/Lib/fractions.py index 6bde7746b8ec..4adb184a9eea 100755 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -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__)) diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index d61294fe48da..979fef75cdf7 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -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"))) diff --git a/Misc/NEWS b/Misc/NEWS index 557af26f3ebf..faf7e1319b88 100644 --- 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