@@ -3180,9 +3180,17 @@ void rearrangeArguments(ParamReceiveSpec paramspec, const ParamNames* param_name
31803180 std::vector<Box*, StlCompatAllocator<Box*>> varargs;
31813181 if (argspec.has_starargs ) {
31823182 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+ }
31863194 }
31873195 }
31883196
@@ -3266,7 +3274,7 @@ void rearrangeArguments(ParamReceiveSpec paramspec, const ParamNames* param_name
32663274 Box* ovarargs = BoxedTuple::create (unused_positional.size (), &unused_positional[0 ]);
32673275 getArg (varargs_idx, oarg1, oarg2, oarg3, oargs) = ovarargs;
32683276 } 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 ,
32703278 (paramspec.num_args == 1 ? " " : " s" ), argspec.num_args + argspec.num_keywords + varargs.size ());
32713279 }
32723280
@@ -3376,8 +3384,17 @@ void rearrangeArguments(ParamReceiveSpec paramspec, const ParamNames* param_name
33763384 for (int i = 0 ; i < paramspec.num_args - paramspec.num_defaults ; i++) {
33773385 if (params_filled[i])
33783386 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+ }
33813398 }
33823399
33833400 for (int arg_idx = paramspec.num_args - paramspec.num_defaults ; arg_idx < paramspec.num_args ; arg_idx++) {
0 commit comments