]> granicus.if.org Git - python/commitdiff
only take into account positional arguments count in related error messages
authorBenjamin Peterson <benjamin@python.org>
Fri, 25 Jun 2010 19:30:21 +0000 (19:30 +0000)
committerBenjamin Peterson <benjamin@python.org>
Fri, 25 Jun 2010 19:30:21 +0000 (19:30 +0000)
Lib/inspect.py
Lib/test/test_extcall.py
Lib/test/test_keywordonlyarg.py
Misc/NEWS
Python/ceval.c

index d6ac4e02ca7c8bc771dae816aea3f8c93a69a463..bfb6d00b5baf192cb38a1428df04ab64f5fcd662 100644 (file)
@@ -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:
index cf882a5650ac6c7bbd80c7bf7f6d2927288022db..c31e920954859d8301c99bdbe3de811489607f69 100644 (file)
@@ -279,13 +279,13 @@ The number of arguments passed in includes keywords:
     >>> 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
index 6a88b3d5d6805f05bdeb6efe45d1c3ede18d5345..bdcc4c6f985a5ee6bd1b6e2627189592a22d257b 100644 (file)
@@ -73,6 +73,14 @@ class KeywordOnlyArgTestCase(unittest.TestCase):
         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)")
index c57ca2c3bb002cafe23bfa9bd95210f6b826f0f4..982ef7045bf4d1bd08a2b191057e2e30fc750e9f 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.
 
index 2055acf26c1e5c393b47e83d7a004fc212f1d95f..6e4911ae925917079fd0c24497533cd062691e8b 100644 (file)
@@ -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;
             }