mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
inspect.Signature.bind: Fix pos-only params with defaults; fix *args in named args #19140
Initial patch by Yann Kaiser (epsy).
This commit is contained in:
parent
8757ead38e
commit
38b0d5a778
2 changed files with 33 additions and 8 deletions
|
@ -2258,6 +2258,8 @@ class Signature:
|
|||
parameters_ex = (param,)
|
||||
break
|
||||
else:
|
||||
# No default, not VAR_KEYWORD, not VAR_POSITIONAL,
|
||||
# not in `kwargs`
|
||||
if partial:
|
||||
parameters_ex = (param,)
|
||||
break
|
||||
|
@ -2296,19 +2298,17 @@ class Signature:
|
|||
# keyword arguments
|
||||
kwargs_param = None
|
||||
for param in itertools.chain(parameters_ex, parameters):
|
||||
if param.kind == _POSITIONAL_ONLY:
|
||||
# This should never happen in case of a properly built
|
||||
# Signature object (but let's have this check here
|
||||
# to ensure correct behaviour just in case)
|
||||
raise TypeError('{arg!r} parameter is positional only, '
|
||||
'but was passed as a keyword'. \
|
||||
format(arg=param.name))
|
||||
|
||||
if param.kind == _VAR_KEYWORD:
|
||||
# Memorize that we have a '**kwargs'-like parameter
|
||||
kwargs_param = param
|
||||
continue
|
||||
|
||||
if param.kind == _VAR_POSITIONAL:
|
||||
# Named arguments don't refer to '*args'-like parameters.
|
||||
# We only arrive here if the positional arguments ended
|
||||
# before reaching the last parameter before *args.
|
||||
continue
|
||||
|
||||
param_name = param.name
|
||||
try:
|
||||
arg_val = kwargs.pop(param_name)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue