]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-104683: Argument Clinic: Refactor the module and class resolver (#108552)
authorErlend E. Aasland <erlend@python.org>
Mon, 28 Aug 2023 12:41:05 +0000 (14:41 +0200)
committerGitHub <noreply@github.com>
Mon, 28 Aug 2023 12:41:05 +0000 (14:41 +0200)
Lib/test/test_clinic.py
Tools/clinic/clinic.py

index e7039d59070597191b8c3d4fd22235e322897984..fcccf988d3a7dd4445b39a51a551254afae06378 100644 (file)
@@ -2324,10 +2324,10 @@ class ClinicParserTest(TestCase):
         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)
 
index 70ec18f726e3f4f76996840ea30b917e917e62c4..1fb53c3483123d10920c3ff9c6bbb55102d907e7 100755 (executable)
@@ -2554,7 +2554,7 @@ impl_definition block
         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 @@ impl_definition block
         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