From 3ca5886b8cf98a4b12d162c5ba38a383c7a6f14a Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 11 Aug 2019 10:35:40 -0700 Subject: [PATCH 1/3] bpo-37819: Add Fraction.as_integer_ratio() --- Doc/library/fractions.rst | 7 +++++++ Lib/fractions.py | 8 ++++++++ Lib/test/test_fractions.py | 6 ++++++ .../next/Library/2019-08-11-10-34-19.bpo-37819.LVJls-.rst | 2 ++ 4 files changed, 23 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-08-11-10-34-19.bpo-37819.LVJls-.rst diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index b5a818e1cafa61..ad34d5411e355f 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -94,6 +94,13 @@ another rational number, or from a string. Denominator of the Fraction in lowest term. + .. method:: as_integer_ratio() + + Return a tuple of integers, whose ratio is exactly equal + to the original Fraction and with a positive denominator. + + .. versionadded:: 3.8 + .. method:: from_float(flt) This class method constructs a :class:`Fraction` representing the exact diff --git a/Lib/fractions.py b/Lib/fractions.py index 7443bd3e0c6af9..b132ccd5c5730c 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -216,6 +216,14 @@ def from_decimal(cls, dec): (cls.__name__, dec, type(dec).__name__)) return cls(*dec.as_integer_ratio()) + def as_integer_ratio(self): + """Return integer ratio. + + Return a pair of integers, whose ratio is exactly equal to the original + Fraction and with a positive denominator. + """ + return (self._numerator, self._denominator) + def limit_denominator(self, max_denominator=1000000): """Closest Fraction to self with denominator at most max_denominator. diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index 27791622005149..18ab28cfebe0c8 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -302,6 +302,12 @@ def testFromDecimal(self): ValueError, "cannot convert NaN to integer ratio", F.from_decimal, Decimal("snan")) + def test_as_integer_ratio(self): + self.assertEqual(F(4, 6).as_integer_ratio(), (2, 3)) + self.assertEqual(F(-4, 6).as_integer_ratio(), (-2, 3)) + self.assertEqual(F(4, -6).as_integer_ratio(), (-2, 3)) + self.assertEqual(F(0, 6).as_integer_ratio(), (0, 1)) + def testLimitDenominator(self): rpi = F('3.1415926535897932') self.assertEqual(rpi.limit_denominator(10000), F(355, 113)) diff --git a/Misc/NEWS.d/next/Library/2019-08-11-10-34-19.bpo-37819.LVJls-.rst b/Misc/NEWS.d/next/Library/2019-08-11-10-34-19.bpo-37819.LVJls-.rst new file mode 100644 index 00000000000000..cfc1f1afb4f765 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-08-11-10-34-19.bpo-37819.LVJls-.rst @@ -0,0 +1,2 @@ +Add Fraction.as_integer_ratio() to match the corresponding methods in bool, +int, float, and decimal. From b521c42174de67f11d2a9d9cd583673bf4160596 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 11 Aug 2019 14:04:31 -0700 Subject: [PATCH 2/3] Address reviewer comments --- Doc/library/fractions.rst | 4 ++-- Lib/fractions.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index ad34d5411e355f..910d16769cc907 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -96,8 +96,8 @@ another rational number, or from a string. .. method:: as_integer_ratio() - Return a tuple of integers, whose ratio is exactly equal - to the original Fraction and with a positive denominator. + Return a tuple of two integers, whose ratio is equal + to the original fraction and with a positive denominator. .. versionadded:: 3.8 diff --git a/Lib/fractions.py b/Lib/fractions.py index b132ccd5c5730c..7f74dc5b95b0dd 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -217,10 +217,10 @@ def from_decimal(cls, dec): return cls(*dec.as_integer_ratio()) def as_integer_ratio(self): - """Return integer ratio. + """Return the integer ratio as a tuple. - Return a pair of integers, whose ratio is exactly equal to the original - Fraction and with a positive denominator. + Return a tuple of two integers, whose ratio is equal to the original + fraction and with a positive denominator. """ return (self._numerator, self._denominator) From b55d9d841ca23a300b6d177efbe190852dddff2d Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 11 Aug 2019 14:18:07 -0700 Subject: [PATCH 3/3] Minor word-smithing. * The other methods spell fraction with a capital F. * The word "original" doesn't make sense because the original fraction is reduced: Fraction(4, 6).as_integer_ratio() |-> (2, 3) --- Doc/library/fractions.rst | 2 +- Lib/fractions.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index 910d16769cc907..58e7126b0bf212 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -97,7 +97,7 @@ another rational number, or from a string. .. method:: as_integer_ratio() Return a tuple of two integers, whose ratio is equal - to the original fraction and with a positive denominator. + to the Fraction and with a positive denominator. .. versionadded:: 3.8 diff --git a/Lib/fractions.py b/Lib/fractions.py index 7f74dc5b95b0dd..e774d58e403539 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -219,8 +219,8 @@ def from_decimal(cls, dec): def as_integer_ratio(self): """Return the integer ratio as a tuple. - Return a tuple of two integers, whose ratio is equal to the original - fraction and with a positive denominator. + Return a tuple of two integers, whose ratio is equal to the + Fraction and with a positive denominator. """ return (self._numerator, self._denominator)