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>
This commit is contained in:
Wim Jeantine-Glenn 2024-05-29 12:46:20 -05:00 committed by GitHub
parent bf4ff3ad2e
commit fcca08ec2f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 10 additions and 1 deletions

View file

@ -848,7 +848,7 @@ def _mod(a, b):
__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 @@ def __pow__(a, b):
result will be rational.
"""
if modulo is not None:
return NotImplemented
if isinstance(b, numbers.Rational):
if b.denominator == 1:
power = b.numerator

View file

@ -1633,6 +1633,12 @@ def test_complex_handling(self):
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()

View file

@ -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.