bpo-41342: Convert int.__round__ to Argument Clinic (GH-21549)
This commit is contained in:
parent
12f433411b
commit
5a2bac7fe0
|
@ -0,0 +1 @@
|
||||||
|
:func:`round` with integer argument is now faster (9--60%).
|
|
@ -87,6 +87,40 @@ exit:
|
||||||
return return_value;
|
return return_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PyDoc_STRVAR(int___round____doc__,
|
||||||
|
"__round__($self, ndigits=<unrepresentable>, /)\n"
|
||||||
|
"--\n"
|
||||||
|
"\n"
|
||||||
|
"Rounding an Integral returns itself.\n"
|
||||||
|
"\n"
|
||||||
|
"Rounding with an ndigits argument also returns an integer.");
|
||||||
|
|
||||||
|
#define INT___ROUND___METHODDEF \
|
||||||
|
{"__round__", (PyCFunction)(void(*)(void))int___round__, METH_FASTCALL, int___round____doc__},
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
int___round___impl(PyObject *self, PyObject *o_ndigits);
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
int___round__(PyObject *self, PyObject *const *args, Py_ssize_t nargs)
|
||||||
|
{
|
||||||
|
PyObject *return_value = NULL;
|
||||||
|
PyObject *o_ndigits = NULL;
|
||||||
|
|
||||||
|
if (!_PyArg_CheckPositional("__round__", nargs, 0, 1)) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
if (nargs < 1) {
|
||||||
|
goto skip_optional;
|
||||||
|
}
|
||||||
|
o_ndigits = args[0];
|
||||||
|
skip_optional:
|
||||||
|
return_value = int___round___impl(self, o_ndigits);
|
||||||
|
|
||||||
|
exit:
|
||||||
|
return return_value;
|
||||||
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(int___sizeof____doc__,
|
PyDoc_STRVAR(int___sizeof____doc__,
|
||||||
"__sizeof__($self, /)\n"
|
"__sizeof__($self, /)\n"
|
||||||
"--\n"
|
"--\n"
|
||||||
|
@ -333,4 +367,4 @@ skip_optional_kwonly:
|
||||||
exit:
|
exit:
|
||||||
return return_value;
|
return return_value;
|
||||||
}
|
}
|
||||||
/*[clinic end generated code: output=4257cfdb155efd00 input=a9049054013a1b77]*/
|
/*[clinic end generated code: output=ea18e51af5b53591 input=a9049054013a1b77]*/
|
||||||
|
|
|
@ -5155,10 +5155,22 @@ _PyLong_DivmodNear(PyObject *a, PyObject *b)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*[clinic input]
|
||||||
|
int.__round__
|
||||||
|
|
||||||
|
ndigits as o_ndigits: object = NULL
|
||||||
|
/
|
||||||
|
|
||||||
|
Rounding an Integral returns itself.
|
||||||
|
|
||||||
|
Rounding with an ndigits argument also returns an integer.
|
||||||
|
[clinic start generated code]*/
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
long_round(PyObject *self, PyObject *args)
|
int___round___impl(PyObject *self, PyObject *o_ndigits)
|
||||||
|
/*[clinic end generated code: output=954fda6b18875998 input=1614cf23ec9e18c3]*/
|
||||||
{
|
{
|
||||||
PyObject *o_ndigits=NULL, *temp, *result, *ndigits;
|
PyObject *temp, *result, *ndigits;
|
||||||
|
|
||||||
/* To round an integer m to the nearest 10**n (n positive), we make use of
|
/* To round an integer m to the nearest 10**n (n positive), we make use of
|
||||||
* the divmod_near operation, defined by:
|
* the divmod_near operation, defined by:
|
||||||
|
@ -5174,8 +5186,6 @@ long_round(PyObject *self, PyObject *args)
|
||||||
*
|
*
|
||||||
* m - divmod_near(m, 10**n)[1].
|
* m - divmod_near(m, 10**n)[1].
|
||||||
*/
|
*/
|
||||||
if (!PyArg_ParseTuple(args, "|O", &o_ndigits))
|
|
||||||
return NULL;
|
|
||||||
if (o_ndigits == NULL)
|
if (o_ndigits == NULL)
|
||||||
return long_long(self);
|
return long_long(self);
|
||||||
|
|
||||||
|
@ -5536,9 +5546,7 @@ static PyMethodDef long_methods[] = {
|
||||||
"Flooring an Integral returns itself."},
|
"Flooring an Integral returns itself."},
|
||||||
{"__ceil__", long_long_meth, METH_NOARGS,
|
{"__ceil__", long_long_meth, METH_NOARGS,
|
||||||
"Ceiling of an Integral returns itself."},
|
"Ceiling of an Integral returns itself."},
|
||||||
{"__round__", (PyCFunction)long_round, METH_VARARGS,
|
INT___ROUND___METHODDEF
|
||||||
"Rounding an Integral returns itself.\n"
|
|
||||||
"Rounding with an ndigits argument also returns an integer."},
|
|
||||||
INT___GETNEWARGS___METHODDEF
|
INT___GETNEWARGS___METHODDEF
|
||||||
INT___FORMAT___METHODDEF
|
INT___FORMAT___METHODDEF
|
||||||
INT___SIZEOF___METHODDEF
|
INT___SIZEOF___METHODDEF
|
||||||
|
|
Loading…
Reference in New Issue