@@ -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" 
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)" num_args ,
3277+         raiseExcHelper (TypeError, " %s() takes exactly  %d argument%s (%ld given)" num_args ,
32703278                       (paramspec.num_args  == 1  ? " " " s" num_args  + argspec.num_keywords  + varargs.size ());
32713279    }
32723280
@@ -3379,8 +3387,17 @@ void rearrangeArguments(ParamReceiveSpec paramspec, const ParamNames* param_name
33793387    for  (int  i = 0 ; i < paramspec.num_args  - paramspec.num_defaults ; i++) {
33803388        if  (params_filled[i])
33813389            continue ;
3382-         raiseExcHelper (TypeError, " %s() takes exactly %d arguments (%ld given)" num_args ,
3383-                        argspec.num_args  + argspec.num_keywords  + varargs.size ());
3390+         long  given = argspec.num_args  + argspec.num_keywords  + varargs.size ();
3391+         int  takes = paramspec.num_args ;
3392+         if  (!(paramspec.takes_varargs  || paramspec.takes_kwargs )) {
3393+             raiseExcHelper (TypeError, " %s() takes exactly %d argument%s (%ld given)" 
3394+                            takes != 1  ? " s" " " 
3395+         } else  {
3396+             if  (given < takes) {
3397+                 raiseExcHelper (TypeError, " %s() takes at least %d argument%s (%ld given)" 
3398+                                takes != 1  ? " s" " " 
3399+             }
3400+         }
33843401    }
33853402
33863403    for  (int  arg_idx = paramspec.num_args  - paramspec.num_defaults ; arg_idx < paramspec.num_args ; arg_idx++) {
0 commit comments