diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2019-09-21 08:22:29 (GMT) |
---|---|---|
committer | Raymond Hettinger <rhettinger@users.noreply.github.com> | 2019-09-21 08:22:29 (GMT) |
commit | 37bc93552375cb1bc616927b5c1905bae3c0e99d (patch) | |
tree | ae8f115f589df2e475117329dcaec70591b1b023 /Python | |
parent | 865bb685a67798eb98dcf5f3a852e08c77792998 (diff) | |
download | cpython-37bc93552375cb1bc616927b5c1905bae3c0e99d.zip cpython-37bc93552375cb1bc616927b5c1905bae3c0e99d.tar.gz cpython-37bc93552375cb1bc616927b5c1905bae3c0e99d.tar.bz2 |
bpo-38237: Let pow() support keyword arguments (GH-16302) (GH-16320)
Backported with release manager approval
Diffstat (limited to 'Python')
-rw-r--r-- | Python/bltinmodule.c | 16 | ||||
-rw-r--r-- | Python/clinic/bltinmodule.c.h | 42 |
2 files changed, 32 insertions, 26 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index c8d34c9..0d3f7ed 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1797,22 +1797,22 @@ builtin_ord(PyObject *module, PyObject *c) /*[clinic input] pow as builtin_pow - x: object - y: object - z: object = None - / + base: object + exp: object + mod: object = None -Equivalent to x**y (with two arguments) or x**y % z (with three arguments) +Equivalent to base**exp (with two arguments) or base**exp % mod (with three arguments) Some types, such as ints, are able to use a more efficient algorithm when invoked using the three argument form. [clinic start generated code]*/ static PyObject * -builtin_pow_impl(PyObject *module, PyObject *x, PyObject *y, PyObject *z) -/*[clinic end generated code: output=50a14d5d130d404b input=653d57d38d41fc07]*/ +builtin_pow_impl(PyObject *module, PyObject *base, PyObject *exp, + PyObject *mod) +/*[clinic end generated code: output=3ca1538221bbf15f input=bd72d0a0ec8e5eb5]*/ { - return PyNumber_Power(x, y, z); + return PyNumber_Power(base, exp, mod); } diff --git a/Python/clinic/bltinmodule.c.h b/Python/clinic/bltinmodule.c.h index b936b0c..f6c5b7c 100644 --- a/Python/clinic/bltinmodule.c.h +++ b/Python/clinic/bltinmodule.c.h @@ -608,39 +608,45 @@ PyDoc_STRVAR(builtin_ord__doc__, {"ord", (PyCFunction)builtin_ord, METH_O, builtin_ord__doc__}, PyDoc_STRVAR(builtin_pow__doc__, -"pow($module, x, y, z=None, /)\n" +"pow($module, /, base, exp, mod=None)\n" "--\n" "\n" -"Equivalent to x**y (with two arguments) or x**y % z (with three arguments)\n" +"Equivalent to base**exp (with two arguments) or base**exp % mod (with three arguments)\n" "\n" "Some types, such as ints, are able to use a more efficient algorithm when\n" "invoked using the three argument form."); #define BUILTIN_POW_METHODDEF \ - {"pow", (PyCFunction)(void(*)(void))builtin_pow, METH_FASTCALL, builtin_pow__doc__}, + {"pow", (PyCFunction)(void(*)(void))builtin_pow, METH_FASTCALL|METH_KEYWORDS, builtin_pow__doc__}, static PyObject * -builtin_pow_impl(PyObject *module, PyObject *x, PyObject *y, PyObject *z); +builtin_pow_impl(PyObject *module, PyObject *base, PyObject *exp, + PyObject *mod); static PyObject * -builtin_pow(PyObject *module, PyObject *const *args, Py_ssize_t nargs) +builtin_pow(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) { PyObject *return_value = NULL; - PyObject *x; - PyObject *y; - PyObject *z = Py_None; - - if (!_PyArg_CheckPositional("pow", nargs, 2, 3)) { + static const char * const _keywords[] = {"base", "exp", "mod", NULL}; + static _PyArg_Parser _parser = {NULL, _keywords, "pow", 0}; + PyObject *argsbuf[3]; + Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2; + PyObject *base; + PyObject *exp; + PyObject *mod = Py_None; + + args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf); + if (!args) { goto exit; } - x = args[0]; - y = args[1]; - if (nargs < 3) { - goto skip_optional; + base = args[0]; + exp = args[1]; + if (!noptargs) { + goto skip_optional_pos; } - z = args[2]; -skip_optional: - return_value = builtin_pow_impl(module, x, y, z); + mod = args[2]; +skip_optional_pos: + return_value = builtin_pow_impl(module, base, exp, mod); exit: return return_value; @@ -849,4 +855,4 @@ builtin_issubclass(PyObject *module, PyObject *const *args, Py_ssize_t nargs) exit: return return_value; } -/*[clinic end generated code: output=4e118c2cd2cd98f3 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=1e2a6185e05ecd11 input=a9049054013a1b77]*/ |