8000 gh-94430: Allow params named `module` or `self` with custom C names i… · python/cpython@8bbd70b · GitHub
[go: up one dir, main page]

Skip to content

Commit 8bbd70b

Browse files
gh-94430: Allow params named module or self with custom C names in Argument Clinic (#94431)
1 parent 3eb2b96 commit 8bbd70b

File tree

3 files changed

+50
-2
lines changed

3 files changed

+50
-2
lines changed

Lib/test/clinic.test

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3518,3 +3518,44 @@ static PyObject *
35183518
test_vararg_with_only_defaults_impl(PyObject *module, PyObject *args, int b,
35193519
PyObject *c)
35203520
/*[clinic end generated code: output=7e393689e6ce61a3 input=fa56a709a035666e]*/
3521+
3522+
/*[clinic input]
3523+
test_paramname_module
3524+
3525+
module as mod: object
3526+
[clinic start generated code]*/
3527+
3528+
PyDoc_STRVAR(test_paramname_module__doc__,
3529+
"test_paramname_module($module, /, module)\n"
3530+
"--\n"
3531+
"\n");
3532+
3533+
#define TEST_PARAMNAME_MODULE_METHODDEF \
3534+
{"test_paramname_module", _PyCFunction_CAST(test_paramname_module), METH_FASTCALL|METH_KEYWORDS, test_paramname_module__doc__},
3535+
3536+
static PyObject *
3537+
test_paramname_module_impl(PyObject *module, PyObject *mod);
3538+
3539+
static PyObject *
3540+
test_paramname_module(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
3541+
{
3542+
PyObject *return_value = NULL;
3543+
static const char * const _keywords[] = {"module", NULL};
3544+
static _PyArg_Parser _parser = {NULL, _keywords, "test_paramname_module", 0};
3545+
PyObject *argsbuf[1];
3546+
PyObject *mod;
3547+
3548+
args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
3549+
if (!args) {
3550+
goto exit;
3551+
}
3552+
mod = args[0];
3553+
return_value = test_paramname_module_impl(module, mod);
3554+
3555+
exit:
3556+
return return_value;
3557+
}
3558+
3559+
static PyObject *
3560+
test_paramname_module_impl(PyObject *module, PyObject *mod)
3561+
/*[clinic end generated code: output=23379a7ffa65c514 input=afefe259667f13ba]*/
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Allow parameters named ``module`` and ``self`` with custom C names in Argument
2+
Clinic. Patch by Erlend E. Aasland

Tools/clinic/clinic.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4710,9 +4710,14 @@ def bad_node(self, node):
47104710

47114711
p = Parameter(parameter_name, kind, function=self.function, converter=converter, default=value, group=self.group)
47124712

4713-
if parameter_name in self.function.parameters:
4713+
names = [k.name for k in self.function.parameters.values()]
4714+
if parameter_name in names[1:]:
47144715
fail("You can't have two parameters named " + repr(parameter_name) + "!")
4715-
self.function.parameters[parameter_name] = p
4716+
elif names and parameter_name == names[0] and c_name is None:
4717+
fail(f"Parameter '{parameter_name}' requires a custom C name")
4718+
4719+
key = f"{parameter_name}_as_{c_name}" if c_name else parameter_name
4720+
self.function.parameters[key] = p
47164721

47174722
def parse_converter(self, annotation):
47184723
if (hasattr(ast, 'Constant') and

0 commit comments

Comments
 (0)
0