From f0f1c239e4addd15180d605306a969a627cb19d5 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 3 Sep 2016 01:55:11 -0700 Subject: Issue 27936: Fix inconsistent round() behavior between float and int --- Lib/test/test_builtin.py | 11 +++++++++++ Lib/test/test_long.py | 2 +- Misc/NEWS | 4 ++++ Python/bltinmodule.c | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 8cc1b00..39c80b0 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -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) diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index b2d008b..4b2d81c 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -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) diff --git a/Misc/NEWS b/Misc/NEWS index 8230745..90f0bdd 100644 --- 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. diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 9e35eb2..9f5db2a 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -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); -- cgit v0.12