mirror of
https://github.com/python/cpython.git
synced 2025-11-03 19:34:08 +00:00
gh-100488: Add is_integer method to fractions.Fraction (#100489)
This commit is contained in:
parent
71159a8e07
commit
e83f88a455
4 changed files with 24 additions and 0 deletions
|
|
@ -117,6 +117,12 @@ another rational number, or from a string.
|
||||||
|
|
||||||
.. versionadded:: 3.8
|
.. versionadded:: 3.8
|
||||||
|
|
||||||
|
.. method:: is_integer()
|
||||||
|
|
||||||
|
Return ``True`` if the Fraction is an integer.
|
||||||
|
|
||||||
|
.. versionadded:: 3.12
|
||||||
|
|
||||||
.. classmethod:: from_float(flt)
|
.. classmethod:: from_float(flt)
|
||||||
|
|
||||||
Alternative constructor which only accepts instances of
|
Alternative constructor which only accepts instances of
|
||||||
|
|
|
||||||
|
|
@ -225,6 +225,10 @@ class Fraction(numbers.Rational):
|
||||||
(cls.__name__, dec, type(dec).__name__))
|
(cls.__name__, dec, type(dec).__name__))
|
||||||
return cls(*dec.as_integer_ratio())
|
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):
|
def as_integer_ratio(self):
|
||||||
"""Return the integer ratio as a tuple.
|
"""Return the integer ratio as a tuple.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -340,6 +340,19 @@ class FractionTest(unittest.TestCase):
|
||||||
ValueError, "cannot convert NaN to integer ratio",
|
ValueError, "cannot convert NaN to integer ratio",
|
||||||
F.from_decimal, Decimal("snan"))
|
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):
|
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(-4, 6).as_integer_ratio(), (-2, 3))
|
||||||
|
|
|
||||||
|
|
@ -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`.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue