[Python-checkins] gh-94430: Allow params named `module` or `self` with custom C names in Argument Clinic (#94431)
erlend-aasland
webhook-mailer at python.org
Thu Jul 7 05:29:40 EDT 2022
https://github.com/python/cpython/commit/8bbd70b4d130f060f87e3f53810dc747a49fa369
commit: 8bbd70b4d130f060f87e3f53810dc747a49fa369
branch: main
author: Erlend Egeberg Aasland <erlend.aasland at protonmail.com>
committer: erlend-aasland <erlend.aasland at protonmail.com>
date: 2022-07-07T11:29:34+02:00
summary:
gh-94430: Allow params named `module` or `self` with custom C names in Argument Clinic (#94431)
files:
A Misc/NEWS.d/next/Tools-Demos/2022-06-29-22-47-11.gh-issue-94430.hdov8L.rst
M Lib/test/clinic.test
M Tools/clinic/clinic.py
diff --git a/Lib/test/clinic.test b/Lib/test/clinic.test
index 94322f6d61771..e981b5a28504e 100644
--- a/Lib/test/clinic.test
+++ b/Lib/test/clinic.test
@@ -3518,3 +3518,44 @@ static PyObject *
test_vararg_with_only_defaults_impl(PyObject *module, PyObject *args, int b,
PyObject *c)
/*[clinic end generated code: output=7e393689e6ce61a3 input=fa56a709a035666e]*/
+
+/*[clinic input]
+test_paramname_module
+
+ module as mod: object
+[clinic start generated code]*/
+
+PyDoc_STRVAR(test_paramname_module__doc__,
+"test_paramname_module($module, /, module)\n"
+"--\n"
+"\n");
+
+#define TEST_PARAMNAME_MODULE_METHODDEF \
+ {"test_paramname_module", _PyCFunction_CAST(test_paramname_module), METH_FASTCALL|METH_KEYWORDS, test_paramname_module__doc__},
+
+static PyObject *
+test_paramname_module_impl(PyObject *module, PyObject *mod);
+
+static PyObject *
+test_paramname_module(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+ PyObject *return_value = NULL;
+ static const char * const _keywords[] = {"module", NULL};
+ static _PyArg_Parser _parser = {NULL, _keywords, "test_paramname_module", 0};
+ PyObject *argsbuf[1];
+ PyObject *mod;
+
+ args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
+ if (!args) {
+ goto exit;
+ }
+ mod = args[0];
+ return_value = test_paramname_module_impl(module, mod);
+
+exit:
+ return return_value;
+}
+
+static PyObject *
+test_paramname_module_impl(PyObject *module, PyObject *mod)
+/*[clinic end generated code: output=23379a7ffa65c514 input=afefe259667f13ba]*/
diff --git a/Misc/NEWS.d/next/Tools-Demos/2022-06-29-22-47-11.gh-issue-94430.hdov8L.rst b/Misc/NEWS.d/next/Tools-Demos/2022-06-29-22-47-11.gh-issue-94430.hdov8L.rst
new file mode 100644
index 0000000000000..88aa8d0866531
--- /dev/null
+++ b/Misc/NEWS.d/next/Tools-Demos/2022-06-29-22-47-11.gh-issue-94430.hdov8L.rst
@@ -0,0 +1,2 @@
+Allow parameters named ``module`` and ``self`` with custom C names in Argument
+Clinic. Patch by Erlend E. Aasland
diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py
index 91aa48c5aa08c..0041363c46be2 100755
--- a/Tools/clinic/clinic.py
+++ b/Tools/clinic/clinic.py
@@ -4710,9 +4710,14 @@ def bad_node(self, node):
p = Parameter(parameter_name, kind, function=self.function, converter=converter, default=value, group=self.group)
- if parameter_name in self.function.parameters:
+ names = [k.name for k in self.function.parameters.values()]
+ if parameter_name in names[1:]:
fail("You can't have two parameters named " + repr(parameter_name) + "!")
- self.function.parameters[parameter_name] = p
+ elif names and parameter_name == names[0] and c_name is None:
+ fail(f"Parameter '{parameter_name}' requires a custom C name")
+
+ key = f"{parameter_name}_as_{c_name}" if c_name else parameter_name
+ self.function.parameters[key] = p
def parse_converter(self, annotation):
if (hasattr(ast, 'Constant') and
More information about the Python-checkins
mailing list