Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-104050: Argument Clinic: Increase CConverter typing coverage #106932

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 16 additions & 13 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -2698,10 +2698,10 @@ class CConverter(metaclass=CConverterAutoRegister):
"""

# The C name to use for this variable.
name: str | None = None
name: str

# The Python name to use for this variable.
py_name: str | None = None
py_name: str

# The C type to use for this variable.
# 'type' should be a Python string specifying the type, e.g. "int".
Expand Down Expand Up @@ -2864,7 +2864,11 @@ def _render_self(self, parameter: Parameter, data: CRenderData) -> None:
if self.length:
data.impl_parameters.append("Py_ssize_t " + self.length_name())

def _render_non_self(self, parameter, data):
def _render_non_self(
self,
parameter: Parameter,
data: CRenderData
) -> None:
self.parameter = parameter
name = self.name

Expand Down Expand Up @@ -2917,31 +2921,30 @@ def render(self, parameter: Parameter, data: CRenderData) -> None:
self._render_self(parameter, data)
self._render_non_self(parameter, data)

def length_name(self):
def length_name(self) -> str:
"""Computes the name of the associated "length" variable."""
if not self.length:
return None
assert self.length is not None
return self.parser_name + "_length"

# Why is this one broken out separately?
# For "positional-only" function parsing,
# which generates a bunch of PyArg_ParseTuple calls.
def parse_argument(self, list):
def parse_argument(self, args: list[str]) -> None:
assert not (self.converter and self.encoding)
if self.format_unit == 'O&':
assert self.converter
list.append(self.converter)
args.append(self.converter)

if self.encoding:
list.append(c_repr(self.encoding))
args.append(c_repr(self.encoding))
elif self.subclass_of:
list.append(self.subclass_of)
args.append(self.subclass_of)

s = ("&" if self.parse_by_reference else "") + self.name
list.append(s)
args.append(s)

if self.length:
list.append("&" + self.length_name())
args.append("&" + self.length_name())

#
# All the functions after here are intended as extension points.
Expand Down Expand Up @@ -3066,7 +3069,7 @@ def set_template_dict(self, template_dict: TemplateDict) -> None:
pass

@property
def parser_name(self):
def parser_name(self) -> str:
if self.name in CLINIC_PREFIXED_ARGS: # bpo-39741
return CLINIC_PREFIX + self.name
else:
Expand Down
Loading