summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-09-21 08:22:29 (GMT)
committerRaymond Hettinger <rhettinger@users.noreply.github.com>2019-09-21 08:22:29 (GMT)
commit37bc93552375cb1bc616927b5c1905bae3c0e99d (patch)
treeae8f115f589df2e475117329dcaec70591b1b023 /Python
parent865bb685a67798eb98dcf5f3a852e08c77792998 (diff)
downloadcpython-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.c16
-rw-r--r--Python/clinic/bltinmodule.c.h42
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]*/