Skip to content
Merged
9 changes: 9 additions & 0 deletions Lib/inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -2943,11 +2943,20 @@ def __init__(self, parameters=None, *, return_annotation=_empty,
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 = 'more than one {} parameter'
msg = msg.format(kind.description)
raise ValueError(msg)

seen_var_parameters.add(kind)

if kind < top_kind:
msg = (
'wrong parameter order: {} parameter before {} '
Expand Down
11 changes: 11 additions & 0 deletions Lib/test/test_inspect/test_inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -2992,6 +2992,17 @@ def test2(pod=42, /):
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)
Expand Down
1 change: 1 addition & 0 deletions Misc/ACKS
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Eitan Adler
Anton Afanasyev
Ali Afshar
Nitika Agarwal
Maxim Ageev
Anjani Agrawal
Pablo S. Blum de Aguiar
Jim Ahlstrom
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Added validation for more than one var-positional or
var-keyword parameters in :class:`inspect.Signature`.
Patch by Maxim Ageev.
Loading