Repository navigation
Argument Clinic name conflict #83922
Description
Activity
Argument clinic uses some extra variables (like args, or noptargs, nargs etc.) for parsing. But there is a catch about these names, the generated code becomes wrong if there are any usages of them inside the signature. Encountered with this problem while working on *args support (in bpo-20291).
The possible solution is prefixing every argument in the parser with __clinic_ (_clinic{var}) for preventing any kind of conflict. I'll draft a PR for this issue.
- added3.9 (EOL)end of lifeend of lifetype-featureA feature request or enhancementA feature request or enhancement
on Feb 24, 2020 After preparing the patch and transforming all arguments with a __clinic_ prefix, I saw there are some actions that are taken by relying on the parser code. An example;
Lines 616 to 631 in 8af4712
co_argcount: int(c_default="self->co_argcount") = -1 co_posonlyargcount: int(c_default="self->co_posonlyargcount") = -1 co_kwonlyargcount: int(c_default="self->co_kwonlyargcount") = -1 co_nlocals: int(c_default="self->co_nlocals") = -1 co_stacksize: int(c_default="self->co_stacksize") = -1 co_flags: int(c_default="self->co_flags") = -1 co_firstlineno: int(c_default="self->co_firstlineno") = -1 co_code: PyBytesObject(c_default="(PyBytesObject *)self->co_code") = None co_consts: object(subclass_of="&PyTuple_Type", c_default="self->co_consts") = None co_names: object(subclass_of="&PyTuple_Type", c_default="self->co_names") = None co_varnames: object(subclass_of="&PyTuple_Type", c_default="self->co_varnames") = None co_freevars: object(subclass_of="&PyTuple_Type", c_default="self->co_freevars") = None co_cellvars: object(subclass_of="&PyTuple_Type", c_default="self->co_cellvars") = None co_filename: unicode(c_default="self->co_filename") = None co_name: unicode(c_default="self->co_name") = None co_lnotab: PyBytesObject(c_default="(PyBytesObject *)self->co_lnotab") = None In that case, self was already replaced with __clinic_self so that code doesn't work. IMHO there should be an identifier to distinguish these cases like; <self>->co_argc etc. When we see such defaults we can just replace them with the prefixed version.
FTR, if you try to use params named "self" in a class method (or "module" in a module level function), AC will bail and ask you to explicitly choose a custom name for the C variable. See #68395 (comment).
I think we can close this after gh-104065 lands.
- linked a pull request that will close this issuegh-68395: Avoid naming conflicts by mangling variable names in Argument Clinic #104065
on May 5, 2023 (If you disagree, Batuhan, please open.)
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields: