diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index e7039d59070597..fcccf988d3a7dd 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -2324,10 +2324,10 @@ def test_invalid_legacy_converter(self): self.expect_failure(block, err, lineno=1) def test_parent_class_or_module_does_not_exist(self): - err = "Parent class or module 'z' does not exist" + err = "Parent class or module 'baz' does not exist" block = """ module m - z.func + baz.func """ self.expect_failure(block, err, lineno=1) diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 70ec18f726e3f4..1fb53c3483123d 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -2554,7 +2554,7 @@ def parse(self, input: str) -> str: return printer.f.getvalue() def _module_and_class( - self, fields: Iterable[str] + self, fields: Sequence[str] ) -> tuple[Module | Clinic, Class | None]: """ fields should be an iterable of field names. @@ -2563,26 +2563,20 @@ def _module_and_class( this function is only ever used to find the parent of where a new class/module should go. """ - parent: Clinic | Module | Class - child: Module | Class | None - module: Clinic | Module + parent: Clinic | Module | Class = self + module: Clinic | Module = self cls: Class | None = None - so_far: list[str] = [] - parent = module = self - - for field in fields: - so_far.append(field) + for idx, field in enumerate(fields): if not isinstance(parent, Class): - child = parent.modules.get(field) - if child: - parent = module = child + if field in parent.modules: + parent = module = parent.modules[field] continue - child = parent.classes.get(field) - if not child: - fullname = ".".join(so_far) + if field in parent.classes: + parent = cls = parent.classes[field] + else: + fullname = ".".join(fields[idx:]) fail(f"Parent class or module {fullname!r} does not exist.") - cls = parent = child return module, cls