Skip to content

Commit 74a7029

Browse files
pythongh-104683: Argument Clinic: Refactor the module and class resolver
1 parent fecb9fa commit 74a7029

File tree

2 files changed

+12
-18
lines changed

2 files changed

+12
-18
lines changed

Lib/test/test_clinic.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2324,10 +2324,10 @@ def test_invalid_legacy_converter(self):
23242324
self.expect_failure(block, err, lineno=1)
23252325

23262326
def test_parent_class_or_module_does_not_exist(self):
2327-
err = "Parent class or module 'z' does not exist"
2327+
err = "Parent class or module 'baz' does not exist"
23282328
block = """
23292329
module m
2330-
z.func
2330+
baz.func
23312331
"""
23322332
self.expect_failure(block, err, lineno=1)
23332333

Tools/clinic/clinic.py

+10-16
Original file line numberDiff line numberDiff line change
@@ -2554,7 +2554,7 @@ def parse(self, input: str) -> str:
25542554
return printer.f.getvalue()
25552555

25562556
def _module_and_class(
2557-
self, fields: Iterable[str]
2557+
self, fields: Sequence[str]
25582558
) -> tuple[Module | Clinic, Class | None]:
25592559
"""
25602560
fields should be an iterable of field names.
@@ -2563,26 +2563,20 @@ def _module_and_class(
25632563
this function is only ever used to find the parent of where
25642564
a new class/module should go.
25652565
"""
2566-
parent: Clinic | Module | Class
2567-
child: Module | Class | None
2568-
module: Clinic | Module
2566+
parent: Clinic | Module | Class = self
2567+
module: Clinic | Module = self
25692568
cls: Class | None = None
2570-
so_far: list[str] = []
25712569

2572-
parent = module = self
2573-
2574-
for field in fields:
2575-
so_far.append(field)
2570+
for idx, field in enumerate(fields):
25762571
if not isinstance(parent, Class):
2577-
child = parent.modules.get(field)
2578-
if child:
2579-
parent = module = child
2572+
if field in parent.modules:
2573+
parent = module = parent.modules[field]
25802574
continue
2581-
child = parent.classes.get(field)
2582-
if not child:
2583-
fullname = ".".join(so_far)
2575+
if field in parent.classes:
2576+
parent = cls = parent.classes[field]
2577+
else:
2578+
fullname = ".".join(fields[idx:])
25842579
fail(f"Parent class or module {fullname!r} does not exist.")
2585-
cls = parent = child
25862580

25872581
return module, cls
25882582

0 commit comments

Comments
 (0)