[Python-checkins] bpo-32968: Make modulo and floor division involving Fraction and float consistent with other operations (#5956)

Mark Dickinson webhook-mailer at python.org
Mon Aug 27 02:59:32 EDT 2018


https://github.com/python/cpython/commit/393f1ff62e032f20adaed2613a9e2d2d6bcb1eb3
commit: 393f1ff62e032f20adaed2613a9e2d2d6bcb1eb3
branch: master
author: Elias Zamaria <mikez302 at gmail.com>
committer: Mark Dickinson <mdickinson at enthought.com>
date: 2018-08-27T07:59:28+01:00
summary:

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.

files:
A Misc/NEWS.d/next/Library/2018-03-18-15-57-32.bpo-32968.E4G7BO.rst
M Lib/fractions.py
M Lib/test/test_fractions.py
M Misc/ACKS

diff --git a/Lib/fractions.py b/Lib/fractions.py
index 8330202d7037..e0a024a03b14 100644
--- a/Lib/fractions.py
+++ b/Lib/fractions.py
@@ -427,23 +427,18 @@ def _div(a, b):
 
     __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
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
index 7905c367ba9d..452f18126de9 100644
--- a/Lib/test/test_fractions.py
+++ b/Lib/test/test_fractions.py
@@ -401,15 +401,19 @@ def testMixedArithmetic(self):
         self.assertTypedEquals(10.0 + 0j, (1.0 + 0j) / F(1, 10))
 
         self.assertTypedEquals(0, F(1, 10) // 1)
-        self.assertTypedEquals(0, F(1, 10) // 1.0)
+        self.assertTypedEquals(0.0, F(1, 10) // 1.0)
         self.assertTypedEquals(10, 1 // F(1, 10))
         self.assertTypedEquals(10**23, 10**22 // F(1, 10))
-        self.assertTypedEquals(10, 1.0 // F(1, 10))
+        self.assertTypedEquals(1.0 // 0.1, 1.0 // F(1, 10))
 
         self.assertTypedEquals(F(1, 10), F(1, 10) % 1)
         self.assertTypedEquals(0.1, F(1, 10) % 1.0)
         self.assertTypedEquals(F(0, 1), 1 % F(1, 10))
-        self.assertTypedEquals(0.0, 1.0 % F(1, 10))
+        self.assertTypedEquals(1.0 % 0.1, 1.0 % F(1, 10))
+        self.assertTypedEquals(0.1, F(1, 10) % float('inf'))
+        self.assertTypedEquals(float('-inf'), F(1, 10) % float('-inf'))
+        self.assertTypedEquals(float('inf'), F(-1, 10) % float('inf'))
+        self.assertTypedEquals(-0.1, F(-1, 10) % float('-inf'))
 
         # No need for divmod since we don't override it.
 
diff --git a/Misc/ACKS b/Misc/ACKS
index 8c8d954a312c..82fbc921feaa 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1814,6 +1814,7 @@ Masazumi Yoshikawa
 Arnaud Ysmal
 Bernard Yue
 Moshe Zadka
+Elias Zamaria
 Milan Zamazal
 Artur Zaprzala
 Mike Zarnstorff
diff --git a/Misc/NEWS.d/next/Library/2018-03-18-15-57-32.bpo-32968.E4G7BO.rst b/Misc/NEWS.d/next/Library/2018-03-18-15-57-32.bpo-32968.E4G7BO.rst
new file mode 100644
index 000000000000..16bf2f342d4c
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-03-18-15-57-32.bpo-32968.E4G7BO.rst
@@ -0,0 +1 @@
+Modulo and floor division involving Fraction and float should return float.



More information about the Python-checkins mailing list