@@ -115,35 +115,20 @@ def wrapped(*args, **kwds):
115
115
raise NotImplementedError
116
116
break
117
117
118
- # loop over positional parameters and actual arguments
119
- lst , dct = [], {}
120
- for arg , (name , parm ) in zip (args , sig .parameters .items ()):
121
- lst .append (normalize_this (arg , parm ))
122
-
123
- # normalize keyword arguments
124
- for name , arg in kwds .items ():
125
- if not name in sig .parameters :
126
- # unknown kwarg, bail out
127
- raise TypeError (
128
- f"{ func .__name__ } () got an unexpected keyword argument '{ name } '."
129
- )
130
-
131
- parm = sig .parameters [name ]
132
- dct [name ] = normalize_this (arg , parm )
133
-
134
- ba = sig .bind (* lst , ** dct )
135
- ba .apply_defaults ()
136
-
137
- # Now that all parameters have been consumed, check:
138
- # Anything that has not been bound is unexpected positional arg => raise.
139
- # If there are too few actual arguments, this fill fail in func(*ba.args) below
140
- if len (args ) > len (ba .args ):
141
- raise TypeError (
142
- f"{ func .__name__ } () takes { len (ba .args )} positional argument but { len (args )} were given."
143
- )
144
-
145
- # finally, pass normalized arguments through
146
- result = func (* ba .args , ** ba .kwargs )
118
+ # normalize positional and keyword arguments
119
+ # NB: extra unknown arguments: pass through, will raise in func(*lst) below
120
+ sp = sig .parameters
121
+
122
+ lst = [normalize_this (arg , parm ) for arg , parm in zip (args , sp .values ())]
123
+ lst += args [len (lst ) :]
124
+
125
+ dct = {
126
+ name : normalize_this (arg , sp [name ]) if name in sp else arg
127
+ for name , arg in kwds .items ()
128
+ }
129
+
130
+ result = func (* lst , ** dct )
131
+
147
132
return result
148
133
149
134
return wrapped
0 commit comments