From 393f1ff62e032f20adaed2613a9e2d2d6bcb1eb3 Mon Sep 17 00:00:00 2001 From: Elias Zamaria Date: Sun, 26 Aug 2018 23:59:28 -0700 Subject: bpo-32968: Make modulo and floor division involving Fraction and float consistent with other operations (#5956) Make mixed-type `%` and `//` operations involving `Fraction` and `float` objects behave like all other mixed-type arithmetic operations: first the `Fraction` object is converted to a `float`, then the `float` operation is performed as normal. This fixes some surprising corner cases, like `Fraction('1/3') % inf` giving a NaN. Thanks Elias Zamaria for the patch. --- Lib/fractions.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) (limited to 'Lib/fractions.py') diff --git a/Lib/fractions.py b/Lib/fractions.py index 8330202d70..e0a024a03b 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -427,23 +427,18 @@ class Fraction(numbers.Rational): __truediv__, __rtruediv__ = _operator_fallbacks(_div, operator.truediv) - def __floordiv__(a, b): + def _floordiv(a, b): """a // b""" return math.floor(a / b) - def __rfloordiv__(b, a): - """a // b""" - return math.floor(a / b) + __floordiv__, __rfloordiv__ = _operator_fallbacks(_floordiv, operator.floordiv) - def __mod__(a, b): + def _mod(a, b): """a % b""" div = a // b return a - b * div - def __rmod__(b, a): - """a % b""" - div = a // b - return a - b * div + __mod__, __rmod__ = _operator_fallbacks(_mod, operator.mod) def __pow__(a, b): """a ** b -- cgit v1.2.1