]> granicus.if.org Git - python/commitdiff
Issue 27936: Fix inconsistent round() behavior between float and int
authorRaymond Hettinger <python@rcn.com>
Sat, 3 Sep 2016 08:55:11 +0000 (01:55 -0700)
committerRaymond Hettinger <python@rcn.com>
Sat, 3 Sep 2016 08:55:11 +0000 (01:55 -0700)
Lib/test/test_builtin.py
Lib/test/test_long.py
Misc/NEWS
Python/bltinmodule.c

index 8cc1b0074bb152e2ce4811722f8201810fc3ad5f..39c80b0da302d36fd253c3dfc88dd60633ac84ee 100644 (file)
@@ -3,6 +3,8 @@
 import ast
 import builtins
 import collections
+import decimal
+import fractions
 import io
 import locale
 import os
@@ -1244,6 +1246,15 @@ class BuiltinTest(unittest.TestCase):
         self.assertEqual(round(5e15+2), 5e15+2)
         self.assertEqual(round(5e15+3), 5e15+3)
 
+    def test_bug_27936(self):
+        # Verify that ndigits=None means the same as passing in no argument
+        for x in [1234,
+                  1234.56,
+                  decimal.Decimal('1234.56'),
+                  fractions.Fraction(123456, 100)]:
+            self.assertEqual(round(x, None), round(x))
+            self.assertEqual(type(round(x, None)), type(round(x)))
+
     def test_setattr(self):
         setattr(sys, 'spam', 1)
         self.assertEqual(sys.spam, 1)
index b2d008b1013594e12b23d8fb82263d4f937a42e2..4b2d81c98a793864249ae987f0f29ff5ffb63352 100644 (file)
@@ -967,7 +967,7 @@ class LongTest(unittest.TestCase):
             self.assertIs(type(got), int)
 
         # bad second argument
-        bad_exponents = ('brian', 2.0, 0j, None)
+        bad_exponents = ('brian', 2.0, 0j)
         for e in bad_exponents:
             self.assertRaises(TypeError, round, 3, e)
 
index 823074597fec8e6e209414fe25ccfdb623f8c3e6..90f0bddaf8e3bfd17cf6355f71c29cfc0e388583 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -18,6 +18,10 @@ Core and Builtins
   ``m_methods`` field to be used to add module level functions to instances
   of non-module types returned from ``Py_create_mod``. Patch by Xiang Zhang.
 
+- Issue #27936: The round() function accepted a second None argument
+  for some types but not for others.  Fixed the inconsistency by
+  accepting None for all numeric types.
+
 - Issue #27487: Warn if a submodule argument to "python -m" or
   runpy.run_module() is found in sys.modules after parent packages are
   imported, but before the submodule is executed.
index 9e35eb2a139ceabbca3d748dca93ff537987184e..9f5db2afe1fe51a48e2178d0b320eb84a3a6171f 100644 (file)
@@ -2039,7 +2039,7 @@ builtin_round(PyObject *self, PyObject *args, PyObject *kwds)
         return NULL;
     }
 
-    if (ndigits == NULL)
+    if (ndigits == NULL || ndigits == Py_None)
         result = PyObject_CallFunctionObjArgs(round, NULL);
     else
         result = PyObject_CallFunctionObjArgs(round, ndigits, NULL);