Skip to content

Commit 04d7bfd

Browse files
committed
Better replication of python style error messages
1 parent 8c73865 commit 04d7bfd

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

src/runtime/objmodel.cpp

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)