Skip to content

Commit 6ba8406

Browse files
gh-104050: Add more type annotations to Argument Clinic (#104631)
Annotate methods of the following classes: - class Function - class Parameter - class LandMine
1 parent bf6dd8f commit 6ba8406

File tree

1 file changed

+44
-23
lines changed

1 file changed

+44
-23
lines changed

Tools/clinic/clinic.py

+44-23
Original file line numberDiff line numberDiff line change
@@ -2416,6 +2416,9 @@ def __repr__(self) -> str:
24162416
INVALID, CALLABLE, STATIC_METHOD, CLASS_METHOD, METHOD_INIT, METHOD_NEW
24172417
""".replace(",", "").strip().split()
24182418

2419+
ParamDict = dict[str, "Parameter"]
2420+
ReturnConverterType = Callable[..., "CReturnConverter"]
2421+
24192422
class Function:
24202423
"""
24212424
Mutable duck type for inspect.Function.
@@ -2428,12 +2431,22 @@ class Function:
24282431
(not docstring) or ((not docstring[0].isspace()) and (docstring.rstrip() == docstring))
24292432
"""
24302433

2431-
def __init__(self, parameters=None, *, name,
2432-
module, cls=None, c_basename=None,
2433-
full_name=None,
2434-
return_converter, return_annotation=inspect.Signature.empty,
2435-
docstring=None, kind=CALLABLE, coexist=False,
2436-
docstring_only=False):
2434+
def __init__(
2435+
self,
2436+
parameters: ParamDict | None = None,
2437+
*,
2438+
name: str,
2439+
module: Module,
2440+
cls: Class | None = None,
2441+
c_basename: str | None = None,
2442+
full_name: str | None = None,
2443+
return_converter: ReturnConverterType,
2444+
return_annotation = inspect.Signature.empty,
2445+
docstring: str | None = None,
2446+
kind: str = CALLABLE,
2447+
coexist: bool = False,
2448+
docstring_only: bool = False
2449+
) -> None:
24372450
self.parameters = parameters or {}
24382451
self.return_annotation = return_annotation
24392452
self.name = name
@@ -2467,7 +2480,7 @@ def render_parameters(self):
24672480
return self.__render_parameters__
24682481

24692482
@property
2470-
def methoddef_flags(self):
2483+
def methoddef_flags(self) -> str | None:
24712484
if self.kind in (METHOD_INIT, METHOD_NEW):
24722485
return None
24732486
flags = []
@@ -2481,10 +2494,10 @@ def methoddef_flags(self):
24812494
flags.append('METH_COEXIST')
24822495
return '|'.join(flags)
24832496

2484-
def __repr__(self):
2497+
def __repr__(self) -> str:
24852498
return '<clinic.Function ' + self.name + '>'
24862499

2487-
def copy(self, **overrides):
2500+
def copy(self, **overrides) -> "Function":
24882501
kwargs = {
24892502
'name': self.name, 'module': self.module, 'parameters': self.parameters,
24902503
'cls': self.cls, 'c_basename': self.c_basename,
@@ -2507,9 +2520,18 @@ class Parameter:
25072520
Mutable duck type of inspect.Parameter.
25082521
"""
25092522

2510-
def __init__(self, name, kind, *, default=inspect.Parameter.empty,
2511-
function, converter, annotation=inspect.Parameter.empty,
2512-
docstring=None, group=0):
2523+
def __init__(
2524+
self,
2525+
name: str,
2526+
kind: str,
2527+
*,
2528+
default = inspect.Parameter.empty,
2529+
function: Function,
2530+
converter: "CConverter",
2531+
annotation = inspect.Parameter.empty,
2532+
docstring: str | None = None,
2533+
group: int = 0
2534+
) -> None:
25132535
self.name = name
25142536
self.kind = kind
25152537
self.default = default
@@ -2519,22 +2541,22 @@ def __init__(self, name, kind, *, default=inspect.Parameter.empty,
25192541
self.docstring = docstring or ''
25202542
self.group = group
25212543

2522-
def __repr__(self):
2544+
def __repr__(self) -> str:
25232545
return '<clinic.Parameter ' + self.name + '>'
25242546

2525-
def is_keyword_only(self):
2547+
def is_keyword_only(self) -> bool:
25262548
return self.kind == inspect.Parameter.KEYWORD_ONLY
25272549

2528-
def is_positional_only(self):
2550+
def is_positional_only(self) -> bool:
25292551
return self.kind == inspect.Parameter.POSITIONAL_ONLY
25302552

2531-
def is_vararg(self):
2553+
def is_vararg(self) -> bool:
25322554
return self.kind == inspect.Parameter.VAR_POSITIONAL
25332555

2534-
def is_optional(self):
2556+
def is_optional(self) -> bool:
25352557
return not self.is_vararg() and (self.default is not unspecified)
25362558

2537-
def copy(self, **overrides):
2559+
def copy(self, **overrides) -> "Parameter":
25382560
kwargs = {
25392561
'name': self.name, 'kind': self.kind, 'default':self.default,
25402562
'function': self.function, 'converter': self.converter, 'annotation': self.annotation,
@@ -2547,7 +2569,7 @@ def copy(self, **overrides):
25472569
kwargs['converter'] = converter
25482570
return Parameter(**kwargs)
25492571

2550-
def get_displayname(self, i):
2572+
def get_displayname(self, i: int) -> str:
25512573
if i == 0:
25522574
return '"argument"'
25532575
if not self.is_positional_only():
@@ -2558,13 +2580,13 @@ def get_displayname(self, i):
25582580

25592581
class LandMine:
25602582
# try to access any
2561-
def __init__(self, message):
2583+
def __init__(self, message: str) -> None:
25622584
self.__message__ = message
25632585

2564-
def __repr__(self):
2586+
def __repr__(self) -> str:
25652587
return '<LandMine ' + repr(self.__message__) + ">"
25662588

2567-
def __getattribute__(self, name):
2589+
def __getattribute__(self, name: str):
25682590
if name in ('__repr__', '__message__'):
25692591
return super().__getattribute__(name)
25702592
# raise RuntimeError(repr(name))
@@ -3023,7 +3045,6 @@ def parser_name(self):
30233045
# The callable may have any number of keyword-only parameters.
30243046
# The callable must return a CReturnConverter object.
30253047
# The callable should not call builtins.print.
3026-
ReturnConverterType = Callable[..., "CReturnConverter"]
30273048
ReturnConverterDict = dict[str, ReturnConverterType]
30283049
return_converters: ReturnConverterDict = {}
30293050

0 commit comments

Comments
 (0)