]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-100488: Add is_integer method to fractions.Fraction (#100489)
authorShantanu <12621235+hauntsaninja@users.noreply.github.com>
Sun, 1 Jan 2023 08:44:48 +0000 (02:44 -0600)
committerGitHub <noreply@github.com>
Sun, 1 Jan 2023 08:44:48 +0000 (01:44 -0700)
Doc/library/fractions.rst
Lib/fractions.py
Lib/test/test_fractions.py
Misc/NEWS.d/next/Library/2022-12-24-04-13-54.gh-issue-100488.Ut8HbE.rst [new file with mode: 0644]

index c46d88b2297aa1645ccf524ca46db2245aa65946..dc9d5fc18215c41b70024e2d287d7e78fbe34000 100644 (file)
@@ -117,6 +117,12 @@ another rational number, or from a string.
 
       .. versionadded:: 3.8
 
+   .. method:: is_integer()
+
+      Return ``True`` if the Fraction is an integer.
+
+      .. versionadded:: 3.12
+
    .. classmethod:: from_float(flt)
 
       Alternative constructor which only accepts instances of
index 75c7df14e1b9c775112f5b4bbcc824d215bce7a7..4302f3f1b98deab10e3f10385c921aeb0149f768 100644 (file)
@@ -225,6 +225,10 @@ class Fraction(numbers.Rational):
                 (cls.__name__, dec, type(dec).__name__))
         return cls(*dec.as_integer_ratio())
 
+    def is_integer(self):
+        """Return True if the Fraction is an integer."""
+        return self._denominator == 1
+
     def as_integer_ratio(self):
         """Return the integer ratio as a tuple.
 
index 7fa9dbea905b592ef6e45e1f78203e62c4d6f899..819d680fd88e4e7404ae23451d5d39f96037bc9e 100644 (file)
@@ -340,6 +340,19 @@ class FractionTest(unittest.TestCase):
             ValueError, "cannot convert NaN to integer ratio",
             F.from_decimal, Decimal("snan"))
 
+    def test_is_integer(self):
+        self.assertTrue(F(1, 1).is_integer())
+        self.assertTrue(F(-1, 1).is_integer())
+        self.assertTrue(F(1, -1).is_integer())
+        self.assertTrue(F(2, 2).is_integer())
+        self.assertTrue(F(-2, 2).is_integer())
+        self.assertTrue(F(2, -2).is_integer())
+
+        self.assertFalse(F(1, 2).is_integer())
+        self.assertFalse(F(-1, 2).is_integer())
+        self.assertFalse(F(1, -2).is_integer())
+        self.assertFalse(F(-1, -2).is_integer())
+
     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))
diff --git a/Misc/NEWS.d/next/Library/2022-12-24-04-13-54.gh-issue-100488.Ut8HbE.rst b/Misc/NEWS.d/next/Library/2022-12-24-04-13-54.gh-issue-100488.Ut8HbE.rst
new file mode 100644 (file)
index 0000000..f7c07c0
--- /dev/null
@@ -0,0 +1 @@
+Add :meth:`Fraction.is_integer` to check whether a :class:`fractions.Fraction` is an integer. This improves duck type compatibility with :class:`float` and :class:`int`.