Skip to content

bpo-30950: Convert round() to Argument Clinic. #2740

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 15, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 16 additions & 19 deletions Python/bltinmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -2049,19 +2049,23 @@ builtin_repr(PyObject *module, PyObject *obj)
}


/* AC: cannot convert yet, as needs PEP 457 group support in inspect
* or a semantic change to accept None for "ndigits"
*/
/*[clinic input]
round as builtin_round

number: object
ndigits: object = NULL

Round a number to a given precision in decimal digits.

The return value is an integer if ndigits is omitted or None. Otherwise
the return value has the same type as the number. ndigits may be negative.
[clinic start generated code]*/

static PyObject *
builtin_round(PyObject *self, PyObject *args, PyObject *kwds)
builtin_round_impl(PyObject *module, PyObject *number, PyObject *ndigits)
/*[clinic end generated code: output=ff0d9dd176c02ede input=854bc3a217530c3d]*/
{
PyObject *ndigits = NULL;
static char *kwlist[] = {"number", "ndigits", 0};
PyObject *number, *round, *result;

if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:round",
kwlist, &number, &ndigits))
return NULL;
PyObject *round, *result;

if (Py_TYPE(number)->tp_dict == NULL) {
if (PyType_Ready(Py_TYPE(number)) < 0)
Expand All @@ -2085,13 +2089,6 @@ builtin_round(PyObject *self, PyObject *args, PyObject *kwds)
return result;
}

PyDoc_STRVAR(round_doc,
"round(number[, ndigits]) -> number\n\
\n\
Round a number to a given precision in decimal digits (default 0 digits).\n\
This returns an int when called with one argument, otherwise the\n\
same type as the number. ndigits may be negative.");


/*AC: we need to keep the kwds dict intact to easily call into the
* list.sort method, which isn't currently supported in AC. So we just use
Expand Down Expand Up @@ -2648,7 +2645,7 @@ static PyMethodDef builtin_methods[] = {
BUILTIN_POW_METHODDEF
{"print", (PyCFunction)builtin_print, METH_FASTCALL | METH_KEYWORDS, print_doc},
BUILTIN_REPR_METHODDEF
{"round", (PyCFunction)builtin_round, METH_VARARGS | METH_KEYWORDS, round_doc},
BUILTIN_ROUND_METHODDEF
BUILTIN_SETATTR_METHODDEF
BUILTIN_SORTED_METHODDEF
BUILTIN_SUM_METHODDEF
Expand Down
36 changes: 35 additions & 1 deletion Python/clinic/bltinmodule.c.h
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,40 @@ PyDoc_STRVAR(builtin_repr__doc__,
#define BUILTIN_REPR_METHODDEF \
{"repr", (PyCFunction)builtin_repr, METH_O, builtin_repr__doc__},

PyDoc_STRVAR(builtin_round__doc__,
"round($module, /, number, ndigits=None)\n"
"--\n"
"\n"
"Round a number to a given precision in decimal digits.\n"
"\n"
"The return value is an integer if ndigits is omitted or None. Otherwise\n"
"the return value has the same type as the number. ndigits may be negative.");

#define BUILTIN_ROUND_METHODDEF \
{"round", (PyCFunction)builtin_round, METH_FASTCALL|METH_KEYWORDS, builtin_round__doc__},

static PyObject *
builtin_round_impl(PyObject *module, PyObject *number, PyObject *ndigits);

static PyObject *
builtin_round(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwnames)
{
PyObject *return_value = NULL;
static const char * const _keywords[] = {"number", "ndigits", NULL};
static _PyArg_Parser _parser = {"O|O:round", _keywords, 0};
PyObject *number;
PyObject *ndigits = NULL;

if (!_PyArg_ParseStackAndKeywords(args, nargs, kwnames, &_parser,
&number, &ndigits)) {
goto exit;
}
return_value = builtin_round_impl(module, number, ndigits);

exit:
return return_value;
}

PyDoc_STRVAR(builtin_sum__doc__,
"sum($module, iterable, start=0, /)\n"
"--\n"
Expand Down Expand Up @@ -676,4 +710,4 @@ builtin_issubclass(PyObject *module, PyObject **args, Py_ssize_t nargs)
exit:
return return_value;
}
/*[clinic end generated code: output=09752daa8cdd6ec7 input=a9049054013a1b77]*/
/*[clinic end generated code: output=d46a224ac804eef1 input=a9049054013a1b77]*/