]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-117613: Argument Clinic: disallow defining class parameter at module level (#117950)
authorneonene <53406459+neonene@users.noreply.github.com>
Wed, 17 Apr 2024 20:43:29 +0000 (05:43 +0900)
committerGitHub <noreply@github.com>
Wed, 17 Apr 2024 20:43:29 +0000 (22:43 +0200)
Lib/test/test_clinic.py
Tools/clinic/libclinic/dsl_parser.py

index 43b629f59f034613e7f6a5c83fc6f103f7eabe4c..d9e4ce280c68a109487b3165d379bdf090d0e9d6 100644 (file)
@@ -2518,6 +2518,15 @@ class ClinicParserTest(TestCase):
         p = function.parameters['cls']
         self.assertEqual(p.kind, inspect.Parameter.POSITIONAL_ONLY)
 
+    def test_disallow_defining_class_at_module_level(self):
+        err = "A 'defining_class' parameter cannot be defined at module level."
+        block = """
+            module m
+            m.func
+                cls: defining_class
+        """
+        self.expect_failure(block, err, lineno=2)
+
 
 class ClinicExternalTest(TestCase):
     maxDiff = None
index 56c6dca3db3d1d5b4d9474e8f132897d6f79b556..cb18374cf07e3c91819357e31ae52a7fa6c8d4c3 100644 (file)
@@ -1102,6 +1102,8 @@ class DSLParser:
                     fail("A 'defining_class' parameter cannot have a default value.")
                 if self.group:
                     fail("A 'defining_class' parameter cannot be in an optional group.")
+                if self.function.cls is None:
+                    fail("A 'defining_class' parameter cannot be defined at module level.")
                 kind = inspect.Parameter.POSITIONAL_ONLY
             else:
                 fail("A 'defining_class' parameter, if specified, must either "