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 {} '
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)