msg = r"^from_bytes\(\) takes at most 2 positional arguments \(3 given\)"
self.assertRaisesRegex(TypeError, msg, int.from_bytes, b'a', 'little', False)
- def test_varargs4(self):
+ def test_varargs1min(self):
msg = r"get expected at least 1 argument, got 0"
self.assertRaisesRegex(TypeError, msg, {}.get)
- def test_varargs5(self):
+ msg = r"expected 1 argument, got 0"
+ self.assertRaisesRegex(TypeError, msg, {}.__delattr__)
+
+ def test_varargs2min(self):
msg = r"getattr expected at least 2 arguments, got 0"
self.assertRaisesRegex(TypeError, msg, getattr)
- def test_varargs6(self):
+ def test_varargs1max(self):
msg = r"input expected at most 1 argument, got 2"
self.assertRaisesRegex(TypeError, msg, input, 1, 2)
- def test_varargs7(self):
+ def test_varargs2max(self):
msg = r"get expected at most 2 arguments, got 3"
self.assertRaisesRegex(TypeError, msg, {}.get, 1, 2, 3)
self.assertEqual(self.getargs(1), (1, -1, -1))
# required positional arg missing
with self.assertRaisesRegex(TypeError,
- r"function takes at least 1 positional arguments \(0 given\)"):
+ r"function takes at least 1 positional argument \(0 given\)"):
self.getargs()
with self.assertRaisesRegex(TypeError,
- r"function takes at least 1 positional arguments \(0 given\)"):
+ r"function takes at least 1 positional argument \(0 given\)"):
self.getargs(keyword=3)
def test_empty_keyword(self):
parse((1,), {'a': 3}, 'OOO', ['', '', 'a'])
parse((1,), {}, 'O|OO', ['', '', 'a'])
with self.assertRaisesRegex(TypeError,
- r'function takes at least 1 positional arguments \(0 given\)'):
+ r'function takes at least 1 positional argument \(0 given\)'):
parse((), {}, 'O|OO', ['', '', 'a'])
parse((1, 2), {'a': 3}, 'OO$O', ['', '', 'a'])
with self.assertRaisesRegex(TypeError,
parse((1,), {'a': 3}, 'OO$O', ['', '', 'a'])
parse((1,), {}, 'O|O$O', ['', '', 'a'])
with self.assertRaisesRegex(TypeError,
- r'function takes at least 1 positional arguments \(0 given\)'):
+ r'function takes at least 1 positional argument \(0 given\)'):
parse((), {}, 'O|O$O', ['', '', 'a'])
with self.assertRaisesRegex(SystemError, r'Empty parameter name after \$'):
parse((1,), {}, 'O|$OO', ['', '', 'a'])
--- /dev/null
+Fix pluralization in TypeError messages in getargs.c and typeobject.c:
+'1 argument' instead of '1 arguments' and '1 element' instead of '1 elements'.
return 1;
PyErr_Format(
PyExc_TypeError,
- "expected %d arguments, got %zd", n, PyTuple_GET_SIZE(ob));
+ "expected %d argument%s, got %zd", n, n == 1 ? "" : "s", PyTuple_GET_SIZE(ob));
return 0;
}
levels[0] = 0;
if (toplevel) {
PyOS_snprintf(msgbuf, bufsize,
- "expected %d arguments, not %" PY_FORMAT_SIZE_T "d",
- n, len);
+ "expected %d argument%s, not %" PY_FORMAT_SIZE_T "d",
+ n,
+ n == 1 ? "" : "s",
+ len);
}
else {
PyOS_snprintf(msgbuf, bufsize,
}
else {
PyErr_Format(PyExc_TypeError,
- "%.200s%s takes %s %d positional arguments"
+ "%.200s%s takes %s %d positional argument%s"
" (%d given)",
(fname == NULL) ? "function" : fname,
(fname == NULL) ? "" : "()",
(min != INT_MAX) ? "at most" : "exactly",
- max, nargs);
+ max,
+ max == 1 ? "" : "s",
+ nargs);
}
return cleanreturn(0, &freelist);
}
if (skip) {
PyErr_Format(PyExc_TypeError,
- "%.200s%s takes %s %d positional arguments"
+ "%.200s%s takes %s %d positional argument%s"
" (%d given)",
(fname == NULL) ? "function" : fname,
(fname == NULL) ? "" : "()",
(Py_MIN(pos, min) < i) ? "at least" : "exactly",
- Py_MIN(pos, min), nargs);
+ Py_MIN(pos, min),
+ Py_MIN(pos, min) == 1 ? "" : "s",
+ nargs);
return cleanreturn(0, &freelist);
}
}
else {
PyErr_Format(PyExc_TypeError,
- "%.200s%s takes %s %d positional arguments (%d given)",
+ "%.200s%s takes %s %d positional argument%s (%d given)",
(parser->fname == NULL) ? "function" : parser->fname,
(parser->fname == NULL) ? "" : "()",
(parser->min != INT_MAX) ? "at most" : "exactly",
- parser->max, nargs);
+ parser->max,
+ parser->max == 1 ? "" : "s",
+ nargs);
}
return cleanreturn(0, &freelist);
}
if (i < pos) {
Py_ssize_t min = Py_MIN(pos, parser->min);
PyErr_Format(PyExc_TypeError,
- "%.200s%s takes %s %d positional arguments"
+ "%.200s%s takes %s %d positional argument%s"
" (%d given)",
(parser->fname == NULL) ? "function" : parser->fname,
(parser->fname == NULL) ? "" : "()",
min < parser->max ? "at least" : "exactly",
- min, nargs);
+ min,
+ min == 1 ? "" : "s",
+ nargs);
}
else {
keyword = PyTuple_GET_ITEM(kwtuple, i - pos);
else
PyErr_Format(
PyExc_TypeError,
- "unpacked tuple should have %s%zd elements,"
+ "unpacked tuple should have %s%zd element%s,"
" but has %zd",
- (min == max ? "" : "at least "), min, nargs);
+ (min == max ? "" : "at least "), min, min == 1 ? "" : "s", nargs);
return 0;
}
else
PyErr_Format(
PyExc_TypeError,
- "unpacked tuple should have %s%zd elements,"
+ "unpacked tuple should have %s%zd element%s,"
" but has %zd",
- (min == max ? "" : "at most "), max, nargs);
+ (min == max ? "" : "at most "), max, max == 1 ? "" : "s", nargs);
return 0;
}