mirror of
https://github.com/python/cpython.git
synced 2026-01-06 15:32:22 +00:00
only take into account positional arguments count in related error messages
This commit is contained in:
parent
5a3ef5b22a
commit
88968ad380
5 changed files with 16 additions and 6 deletions
|
|
@ -959,7 +959,7 @@ def getcallargs(func, *positional, **named):
|
|||
else:
|
||||
arg2value[varargs] = ()
|
||||
elif 0 < num_args < num_pos:
|
||||
raise TypeError('%s() takes %s %d %s (%d given)' % (
|
||||
raise TypeError('%s() takes %s %d positional %s (%d given)' % (
|
||||
f_name, 'at most' if defaults else 'exactly', num_args,
|
||||
'arguments' if num_args > 1 else 'argument', num_total))
|
||||
elif num_args == 0 and num_total:
|
||||
|
|
|
|||
|
|
@ -279,13 +279,13 @@
|
|||
>>> f(6, a=4, *(1, 2, 3))
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: f() takes exactly 1 argument (5 given)
|
||||
TypeError: f() takes exactly 1 positional argument (5 given)
|
||||
>>> def f(a, *, kw):
|
||||
... pass
|
||||
>>> f(6, 4, kw=4)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: f() takes exactly 2 arguments (3 given)
|
||||
TypeError: f() takes exactly 1 positional argument (3 given)
|
||||
"""
|
||||
|
||||
import sys
|
||||
|
|
|
|||
|
|
@ -73,6 +73,14 @@ def testSyntaxForManyArguments(self):
|
|||
fundef3 += "lastarg):\n pass\n"
|
||||
compile(fundef3, "<test>", "single")
|
||||
|
||||
def testTooManyPositionalErrorMessage(self):
|
||||
def f(a, b=None, *, c=None):
|
||||
pass
|
||||
with self.assertRaises(TypeError) as exc:
|
||||
f(1, 2, 3)
|
||||
expected = "f() takes at most 2 positional arguments (3 given)"
|
||||
self.assertEqual(str(exc.exception), expected)
|
||||
|
||||
def testSyntaxErrorForFunctionCall(self):
|
||||
self.assertRaisesSyntaxError("f(p, k=1, p2)")
|
||||
self.assertRaisesSyntaxError("f(p, k1=50, *(1,2), k1=100)")
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@ What's New in Python 3.2 Alpha 1?
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Be more specific in error messages about positional arguments.
|
||||
|
||||
- Issue #8949: "z" format of PyArg_Parse*() functions doesn't accept bytes
|
||||
objects, as described in the documentation.
|
||||
|
||||
|
|
|
|||
|
|
@ -3100,11 +3100,11 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
|
|||
if (!(co->co_flags & CO_VARARGS)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%U() takes %s %d "
|
||||
"argument%s (%d given)",
|
||||
"positional argument%s (%d given)",
|
||||
co->co_name,
|
||||
defcount ? "at most" : "exactly",
|
||||
total_args,
|
||||
total_args == 1 ? "" : "s",
|
||||
co->co_argcount,
|
||||
co->co_argcount == 1 ? "" : "s",
|
||||
argcount + kwcount);
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue