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: Add more type annotations to Argument Clinic #104628

Merged
merged 3 commits into from
May 18, 2023
Merged
Changes from 1 commit
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
50 changes: 36 additions & 14 deletions Tools/clinic/clinic.py
Original file line number Diff line number Diff line change
Expand Up @@ -2227,7 +2227,12 @@ def _module_and_class(self, fields):
return module, cls


def parse_file(filename, *, verify=True, output=None):
def parse_file(
filename: str,
*,
verify: bool = True,
output: str | None = None
) -> None:
if not output:
output = filename

Expand Down Expand Up @@ -2259,7 +2264,7 @@ def parse_file(filename, *, verify=True, output=None):
write_file(fn, data)


def compute_checksum(input, length=None):
def compute_checksum(input: str, length: int | None = None) -> str:
input = input or ''
erlend-aasland marked this conversation as resolved.
Show resolved Hide resolved
s = hashlib.sha1(input.encode('utf-8')).hexdigest()
if length:
Expand All @@ -2270,44 +2275,61 @@ def compute_checksum(input, length=None):


class PythonParser:
def __init__(self, clinic):
def __init__(self, clinic: Clinic) -> None:
pass

def parse(self, block):
def parse(self, block: Block) -> None:
s = io.StringIO()
with OverrideStdioWith(s):
exec(block.input)
block.output = s.getvalue()


class Module:
def __init__(self, name, module=None):
def __init__(
self,
name: str,
module: Module | None = None
) -> None:
self.name = name
self.module = self.parent = module

self.modules = collections.OrderedDict()
self.classes = collections.OrderedDict()
self.functions = []
self.modules: ModuleDict = collections.OrderedDict()
self.classes: ClassDict = collections.OrderedDict()
Comment on lines +2304 to +2305
Copy link
Member

@AlexWaygood AlexWaygood May 18, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since we're touching these lines anyway: do these need to be OrderedDicts anymore? Regular dicts are guaranteed by the language spec to be ordered on 3.7+ (and clinic now requires 3.10+), and regular dicts are faster than OrderedDicts. OrderedDicts are mainly there for backwards compatibility these days (they have a few fancy methods that dicts don't have, but I really doubt we need any of them in clinic.py).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could leave this to another PR, though

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, regular dicts should be fine post 3.7.

self.functions: list[Function] = []

def __repr__(self):
def __repr__(self) -> str:
return "<clinic.Module " + repr(self.name) + " at " + str(id(self)) + ">"

ModuleDict = dict[str, Module]
erlend-aasland marked this conversation as resolved.
Show resolved Hide resolved


class Class:
def __init__(self, name, module=None, cls=None, typedef=None, type_object=None):
def __init__(
self,
name: str,
module: Module | None = None,
cls: Class | None = None,
typedef: str | None = None,
type_object: str | None = None
) -> None:
self.name = name
self.module = module
self.cls = cls
self.typedef = typedef
self.type_object = type_object
self.parent = cls or module

self.classes = collections.OrderedDict()
self.functions = []
self.classes: ClassDict = collections.OrderedDict()
self.functions: list[Function] = []

def __repr__(self):
def __repr__(self) -> str:
return "<clinic.Class " + repr(self.name) + " at " + str(id(self)) + ">"

unsupported_special_methods = set("""
ClassDict = dict[str, Class]


unsupported_special_methods: set[str] = set("""

__abs__
__add__
Expand Down