]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-127610: Added validation for more than one var-positional and var-keyword paramete...
authorApostol Fet <90645107+ApostolFet@users.noreply.github.com>
Sun, 8 Dec 2024 10:05:15 +0000 (13:05 +0300)
committerGitHub <noreply@github.com>
Sun, 8 Dec 2024 10:05:15 +0000 (12:05 +0200)
Lib/inspect.py
Lib/test/test_inspect/test_inspect.py
Misc/ACKS
Misc/NEWS.d/next/Library/2024-12-06-17-28-55.gh-issue-127610.ctv_NP.rst [new file with mode: 0644]

index e3f74e9f047eafc81fe26fa4b616133f68af4d3a..b7d8271f8a471f886c7f44b39f78d125d2166e93 100644 (file)
@@ -2943,11 +2943,19 @@ class Signature:
                 params = OrderedDict()
                 top_kind = _POSITIONAL_ONLY
                 seen_default = False
+                seen_var_parameters = set()
 
                 for param in parameters:
                     kind = param.kind
                     name = param.name
 
+                    if kind in (_VAR_POSITIONAL, _VAR_KEYWORD):
+                        if kind in seen_var_parameters:
+                            msg = f'more than one {kind.description} parameter'
+                            raise ValueError(msg)
+
+                        seen_var_parameters.add(kind)
+
                     if kind < top_kind:
                         msg = (
                             'wrong parameter order: {} parameter before {} '
index a92627a4d60f6878571516d54889b9af4e1e5543..1ecf18bf49fa7ebbe899121bb9fc6a4a830c894a 100644 (file)
@@ -2992,6 +2992,17 @@ class TestSignatureObject(unittest.TestCase):
         with self.assertRaisesRegex(ValueError, 'follows default argument'):
             S((pkd, pk))
 
+        second_args = args.replace(name="second_args")
+        with self.assertRaisesRegex(ValueError, 'more than one variadic positional parameter'):
+            S((args, second_args))
+
+        with self.assertRaisesRegex(ValueError, 'more than one variadic positional parameter'):
+            S((args, ko, second_args))
+
+        second_kwargs = kwargs.replace(name="second_kwargs")
+        with self.assertRaisesRegex(ValueError, 'more than one variadic keyword parameter'):
+            S((kwargs, second_kwargs))
+
     def test_signature_object_pickle(self):
         def foo(a, b, *, c:1={}, **kw) -> {42:'ham'}: pass
         foo_partial = functools.partial(foo, a=1)
index 913f7c8ecf5f1e15ecde637d9222ac12928f7f90..086930666822ad75783a7113d88f16f7d6b00b69 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -24,6 +24,7 @@ Eitan Adler
 Anton Afanasyev
 Ali Afshar
 Nitika Agarwal
+Maxim Ageev
 Anjani Agrawal
 Pablo S. Blum de Aguiar
 Jim Ahlstrom
diff --git a/Misc/NEWS.d/next/Library/2024-12-06-17-28-55.gh-issue-127610.ctv_NP.rst b/Misc/NEWS.d/next/Library/2024-12-06-17-28-55.gh-issue-127610.ctv_NP.rst
new file mode 100644 (file)
index 0000000..5876902
--- /dev/null
@@ -0,0 +1,3 @@
+Added validation for more than one var-positional or
+var-keyword parameters in :class:`inspect.Signature`.
+Patch by Maxim Ageev.