mirror of
https://github.com/python/cpython.git
synced 2025-07-19 09:15:34 +00:00
bpo-38237: Make pow's arguments have more descriptive names and be keyword passable (GH-16302)
Edit: `math.pow` changes removed on Mark's request. https://bugs.python.org/issue38237 Automerge-Triggered-By: @rhettinger
This commit is contained in:
parent
e267793aa4
commit
87d6cd3604
6 changed files with 72 additions and 48 deletions
|
@ -1796,22 +1796,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);
|
||||
}
|
||||
|
||||
|
||||
|
|
40
Python/clinic/bltinmodule.c.h
generated
40
Python/clinic/bltinmodule.c.h
generated
|
@ -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;
|
||||
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;
|
||||
|
||||
if (!_PyArg_CheckPositional("pow", nargs, 2, 3)) {
|
||||
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]*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue