mirror of https://github.com/python/cpython
gh-120080: Accept ``None`` as a valid argument for direct call of the ``int.__round__`` (#120088)
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
This commit is contained in:
parent
bd826b9c77
commit
57ad769076
|
@ -949,6 +949,12 @@ class RoundTestCase(unittest.TestCase):
|
||||||
self.assertEqual(x, 2)
|
self.assertEqual(x, 2)
|
||||||
self.assertIsInstance(x, int)
|
self.assertIsInstance(x, int)
|
||||||
|
|
||||||
|
def test_round_with_none_arg_direct_call(self):
|
||||||
|
for val in [(1.0).__round__(None),
|
||||||
|
round(1.0),
|
||||||
|
round(1.0, None)]:
|
||||||
|
self.assertEqual(val, 1)
|
||||||
|
self.assertIs(type(val), int)
|
||||||
|
|
||||||
# Beginning with Python 2.6 float has cross platform compatible
|
# Beginning with Python 2.6 float has cross platform compatible
|
||||||
# ways to create and represent inf and nan
|
# ways to create and represent inf and nan
|
||||||
|
|
|
@ -5412,7 +5412,6 @@ class TestSignatureDefinitions(unittest.TestCase):
|
||||||
'bytearray': {'count', 'endswith', 'find', 'hex', 'index', 'rfind', 'rindex', 'startswith'},
|
'bytearray': {'count', 'endswith', 'find', 'hex', 'index', 'rfind', 'rindex', 'startswith'},
|
||||||
'bytes': {'count', 'endswith', 'find', 'hex', 'index', 'rfind', 'rindex', 'startswith'},
|
'bytes': {'count', 'endswith', 'find', 'hex', 'index', 'rfind', 'rindex', 'startswith'},
|
||||||
'dict': {'pop'},
|
'dict': {'pop'},
|
||||||
'int': {'__round__'},
|
|
||||||
'memoryview': {'cast', 'hex'},
|
'memoryview': {'cast', 'hex'},
|
||||||
'str': {'count', 'endswith', 'find', 'index', 'maketrans', 'rfind', 'rindex', 'startswith'},
|
'str': {'count', 'endswith', 'find', 'index', 'maketrans', 'rfind', 'rindex', 'startswith'},
|
||||||
}
|
}
|
||||||
|
|
|
@ -517,6 +517,12 @@ class IntTestCases(unittest.TestCase):
|
||||||
self.assertEqual(int('1_2_3_4_5_6_7_8_9', 16), 0x123456789)
|
self.assertEqual(int('1_2_3_4_5_6_7_8_9', 16), 0x123456789)
|
||||||
self.assertEqual(int('1_2_3_4_5_6_7', 32), 1144132807)
|
self.assertEqual(int('1_2_3_4_5_6_7', 32), 1144132807)
|
||||||
|
|
||||||
|
def test_round_with_none_arg_direct_call(self):
|
||||||
|
for val in [(1).__round__(None),
|
||||||
|
round(1),
|
||||||
|
round(1, None)]:
|
||||||
|
self.assertEqual(val, 1)
|
||||||
|
self.assertIs(type(val), int)
|
||||||
|
|
||||||
class IntStrDigitLimitsTests(unittest.TestCase):
|
class IntStrDigitLimitsTests(unittest.TestCase):
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Direct call to the :meth:`!int.__round__` now accepts ``None``
|
||||||
|
as a valid argument.
|
|
@ -116,7 +116,7 @@ exit:
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(int___round____doc__,
|
PyDoc_STRVAR(int___round____doc__,
|
||||||
"__round__($self, ndigits=<unrepresentable>, /)\n"
|
"__round__($self, ndigits=None, /)\n"
|
||||||
"--\n"
|
"--\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Rounding an Integral returns itself.\n"
|
"Rounding an Integral returns itself.\n"
|
||||||
|
@ -133,7 +133,7 @@ static PyObject *
|
||||||
int___round__(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
|
int___round__(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
|
||||||
{
|
{
|
||||||
PyObject *return_value = NULL;
|
PyObject *return_value = NULL;
|
||||||
PyObject *o_ndigits = NULL;
|
PyObject *o_ndigits = Py_None;
|
||||||
|
|
||||||
if (!_PyArg_CheckPositional("__round__", nargs, 0, 1)) {
|
if (!_PyArg_CheckPositional("__round__", nargs, 0, 1)) {
|
||||||
goto exit;
|
goto exit;
|
||||||
|
@ -476,4 +476,4 @@ int_is_integer(PyObject *self, PyObject *Py_UNUSED(ignored))
|
||||||
{
|
{
|
||||||
return int_is_integer_impl(self);
|
return int_is_integer_impl(self);
|
||||||
}
|
}
|
||||||
/*[clinic end generated code: output=2ba2d8dcda9b99da input=a9049054013a1b77]*/
|
/*[clinic end generated code: output=a53f5ba9a6c16737 input=a9049054013a1b77]*/
|
||||||
|
|
|
@ -6045,7 +6045,7 @@ _PyLong_DivmodNear(PyObject *a, PyObject *b)
|
||||||
/*[clinic input]
|
/*[clinic input]
|
||||||
int.__round__
|
int.__round__
|
||||||
|
|
||||||
ndigits as o_ndigits: object = NULL
|
ndigits as o_ndigits: object = None
|
||||||
/
|
/
|
||||||
|
|
||||||
Rounding an Integral returns itself.
|
Rounding an Integral returns itself.
|
||||||
|
@ -6055,7 +6055,7 @@ Rounding with an ndigits argument also returns an integer.
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
int___round___impl(PyObject *self, PyObject *o_ndigits)
|
int___round___impl(PyObject *self, PyObject *o_ndigits)
|
||||||
/*[clinic end generated code: output=954fda6b18875998 input=1614cf23ec9e18c3]*/
|
/*[clinic end generated code: output=954fda6b18875998 input=30c2aec788263144]*/
|
||||||
{
|
{
|
||||||
PyObject *temp, *result, *ndigits;
|
PyObject *temp, *result, *ndigits;
|
||||||
|
|
||||||
|
@ -6073,7 +6073,7 @@ int___round___impl(PyObject *self, PyObject *o_ndigits)
|
||||||
*
|
*
|
||||||
* m - divmod_near(m, 10**n)[1].
|
* m - divmod_near(m, 10**n)[1].
|
||||||
*/
|
*/
|
||||||
if (o_ndigits == NULL)
|
if (o_ndigits == Py_None)
|
||||||
return long_long(self);
|
return long_long(self);
|
||||||
|
|
||||||
ndigits = _PyNumber_Index(o_ndigits);
|
ndigits = _PyNumber_Index(o_ndigits);
|
||||||
|
|
Loading…
Reference in New Issue