@@ -3180,9 +3180,17 @@ void rearrangeArguments(ParamReceiveSpec paramspec, const ParamNames* param_name
3180
3180
std::vector<Box*, StlCompatAllocator<Box*>> varargs;
3181
3181
if (argspec.has_starargs ) {
3182
3182
assert (!rewrite_args);
3183
- Box* given_varargs = getArg (argspec.num_args + argspec.num_keywords , arg1, arg2, arg3, args);
3184
- for (Box* e : given_varargs->pyElements ()) {
3185
- varargs.push_back (e);
3183
+ Box* given_varargs = nullptr ;
3184
+ try {
3185
+ given_varargs = getArg (argspec.num_args + argspec.num_keywords , arg1, arg2, arg3, args);
3186
+ for (Box* e : given_varargs->pyElements ()) {
3187
+ varargs.push_back (e);
3188
+ }
3189
+ } catch (ExcInfo const & e) {
3190
+ if (e.type == TypeError) {
3191
+ raiseExcHelper (TypeError, " %s() argument after * must be a sequence, not %s" , func_name,
3192
+ getTypeName (given_varargs));
3193
+ }
3186
3194
}
3187
3195
}
3188
3196
@@ -3266,7 +3274,7 @@ void rearrangeArguments(ParamReceiveSpec paramspec, const ParamNames* param_name
3266
3274
Box* ovarargs = BoxedTuple::create (unused_positional.size (), &unused_positional[0 ]);
3267
3275
getArg (varargs_idx, oarg1, oarg2, oarg3, oargs) = ovarargs;
3268
3276
} else if (unused_positional.size ()) {
3269
- raiseExcHelper (TypeError, " %s() takes at most %d argument%s (%ld given)" , func_name, paramspec.num_args ,
3277
+ raiseExcHelper (TypeError, " %s() takes exactly %d argument%s (%ld given)" , func_name, paramspec.num_args ,
3270
3278
(paramspec.num_args == 1 ? " " : " s" ), argspec.num_args + argspec.num_keywords + varargs.size ());
3271
3279
}
3272
3280
@@ -3376,8 +3384,17 @@ void rearrangeArguments(ParamReceiveSpec paramspec, const ParamNames* param_name
3376
3384
for (int i = 0 ; i < paramspec.num_args - paramspec.num_defaults ; i++) {
3377
3385
if (params_filled[i])
3378
3386
continue ;
3379
- raiseExcHelper (TypeError, " %s() takes exactly %d arguments (%ld given)" , func_name, paramspec.num_args ,
3380
- argspec.num_args + argspec.num_keywords + varargs.size ());
3387
+ long given = argspec.num_args + argspec.num_keywords + varargs.size ();
3388
+ int takes = paramspec.num_args ;
3389
+ if (!(paramspec.takes_varargs || paramspec.takes_kwargs )) {
3390
+ raiseExcHelper (TypeError, " %s() takes exactly %d argument%s (%ld given)" , func_name, takes,
3391
+ takes != 1 ? " s" : " " , given);
3392
+ } else {
3393
+ if (given < takes) {
3394
+ raiseExcHelper (TypeError, " %s() takes at least %d argument%s (%ld given)" , func_name, takes,
3395
+ takes != 1 ? " s" : " " , given);
3396
+ }
3397
+ }
3381
3398
}
3382
3399
3383
3400
for (int arg_idx = paramspec.num_args - paramspec.num_defaults ; arg_idx < paramspec.num_args ; arg_idx++) {
0 commit comments