diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-11-15 15:51:14 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-15 15:51:14 (GMT) |
commit | aca7f574b06c72c85a5e3e4b16a8a5e384a7c4a8 (patch) | |
tree | 7a6c4059603b006765f7f857fcf2f9698d9b7bc2 /Python | |
parent | 00987f6230fcdbecc8d9ab4b2b9fae8f99a1a4a9 (diff) | |
download | cpython-aca7f574b06c72c85a5e3e4b16a8a5e384a7c4a8.zip cpython-aca7f574b06c72c85a5e3e4b16a8a5e384a7c4a8.tar.gz cpython-aca7f574b06c72c85a5e3e4b16a8a5e384a7c4a8.tar.bz2 |
bpo-30950: Convert round() to Argument Clinic. (#2740)
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bltinmodule.c | 35 | ||||
-rw-r--r-- | Python/clinic/bltinmodule.c.h | 36 |
2 files changed, 51 insertions, 20 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 8eac0af..81774dc 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -2079,19 +2079,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) @@ -2115,13 +2119,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 @@ -2679,7 +2676,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 diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h index fa327da..3647e62 100644 --- a/Python/clinic/bltinmodule.c.h +++ b/Python/clinic/bltinmodule.c.h @@ -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" @@ -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]*/ |