bpo-37819: Add Fraction.as_integer_ratio() (GH-15212)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Sun, 11 Aug 2019 21:40:59 +0000 (14:40 -0700)
committerGitHub <noreply@github.com>
Sun, 11 Aug 2019 21:40:59 +0000 (14:40 -0700)
Doc/library/fractions.rst
Lib/fractions.py
Lib/test/test_fractions.py
Misc/NEWS.d/next/Library/2019-08-11-10-34-19.bpo-37819.LVJls-.rst [new file with mode: 0644]

index b5a818e1cafa6162cb291813be6937a9566194f8..58e7126b0bf212fddadfc125cee7dae05251752f 100644 (file)
@@ -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 two integers, whose ratio is equal
+      to the Fraction and with a positive denominator.
+
+      .. versionadded:: 3.8
+
    .. method:: from_float(flt)
 
       This class method constructs a :class:`Fraction` representing the exact
index 7443bd3e0c6af999d6031b108a4e9374aa8b4384..e774d58e403539bfee8c999031388451738865d2 100644 (file)
@@ -216,6 +216,14 @@ class Fraction(numbers.Rational):
                 (cls.__name__, dec, type(dec).__name__))
         return cls(*dec.as_integer_ratio())
 
+    def as_integer_ratio(self):
+        """Return the integer ratio as a tuple.
+
+        Return a tuple of two integers, whose ratio is equal to the
+        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.
 
index 2779162200514919b64c19dcee677c8f891dda97..18ab28cfebe0c8f099fedaafb3f04fdb8ed2d952 100644 (file)
@@ -302,6 +302,12 @@ class FractionTest(unittest.TestCase):
             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 (file)
index 0000000..cfc1f1a
--- /dev/null
@@ -0,0 +1,2 @@
+Add Fraction.as_integer_ratio() to match the corresponding methods in bool,
+int, float, and decimal.