summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWim Jeantine-Glenn <hey@wimglenn.com>2024-05-29 17:46:20 (GMT)
committerGitHub <noreply@github.com>2024-05-29 17:46:20 (GMT)
commitfcca08ec2f48f4ba5ba1d4690fb39b1efe630944 (patch)
treeb874582eadea61278f502ed0219e92e5b4fd077e
parentbf4ff3ad2e362801e87c85fffd9e140b774cef26 (diff)
downloadcpython-fcca08ec2f48f4ba5ba1d4690fb39b1efe630944.zip
cpython-fcca08ec2f48f4ba5ba1d4690fb39b1efe630944.tar.gz
cpython-fcca08ec2f48f4ba5ba1d4690fb39b1efe630944.tar.bz2
gh-119594: Improve pow(fraction.Fraction(), b, modulo) error message (#119593)
If one calls pow(fractions.Fraction, x, module) with modulo not None, the error message now says that the types are incompatible rather than saying pow only takes 2 arguments. Implemented by having fractions.Fraction __pow__ accept optional modulo argument and return NotImplemented if not None. pow() then raises with appropriate message. --------- Co-authored-by: Mark Dickinson <dickinsm@gmail.com>
-rw-r--r--Lib/fractions.py4
-rw-r--r--Lib/test/test_fractions.py6
-rw-r--r--Misc/NEWS.d/next/Library/2024-05-26-22-22-51.gh-issue-119594.fnQNM8.rst1
3 files changed, 10 insertions, 1 deletions
diff --git a/Lib/fractions.py b/Lib/fractions.py
index f8c6c9c..f91b4f3 100644
--- a/Lib/fractions.py
+++ b/Lib/fractions.py
@@ -848,7 +848,7 @@ class Fraction(numbers.Rational):
__mod__, __rmod__ = _operator_fallbacks(_mod, operator.mod, False)
- def __pow__(a, b):
+ def __pow__(a, b, modulo=None):
"""a ** b
If b is not an integer, the result will be a float or complex
@@ -856,6 +856,8 @@ class Fraction(numbers.Rational):
result will be rational.
"""
+ if modulo is not None:
+ return NotImplemented
if isinstance(b, numbers.Rational):
if b.denominator == 1:
power = b.numerator
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
index 3a714c6..3648a89 100644
--- a/Lib/test/test_fractions.py
+++ b/Lib/test/test_fractions.py
@@ -1633,6 +1633,12 @@ class FractionTest(unittest.TestCase):
message % ("divmod()", "complex", "Fraction"),
divmod, b, a)
+ def test_three_argument_pow(self):
+ message = "unsupported operand type(s) for ** or pow(): '%s', '%s', '%s'"
+ self.assertRaisesMessage(TypeError,
+ message % ("Fraction", "int", "int"),
+ pow, F(3), 4, 5)
+
if __name__ == '__main__':
unittest.main()
diff --git a/Misc/NEWS.d/next/Library/2024-05-26-22-22-51.gh-issue-119594.fnQNM8.rst b/Misc/NEWS.d/next/Library/2024-05-26-22-22-51.gh-issue-119594.fnQNM8.rst
new file mode 100644
index 0000000..d2de527
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-05-26-22-22-51.gh-issue-119594.fnQNM8.rst
@@ -0,0 +1 @@
+If one calls pow(fractions.Fraction, x, module) with modulo not None, the error message now says that the types are incompatible rather than saying pow only takes 2 arguments. Patch by Wim Jeantine-Glenn and Mark Dickinson.