From 88968ad380752227656e2ab4425315e474e26336 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Fri, 25 Jun 2010 19:30:21 +0000 Subject: only take into account positional arguments count in related error messages --- Lib/inspect.py | 2 +- Lib/test/test_extcall.py | 4 ++-- Lib/test/test_keywordonlyarg.py | 8 ++++++++ Misc/NEWS | 2 ++ Python/ceval.c | 6 +++--- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Lib/inspect.py b/Lib/inspect.py index d6ac4e0..bfb6d00 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -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: diff --git a/Lib/test/test_extcall.py b/Lib/test/test_extcall.py index cf882a5..c31e920 100644 --- a/Lib/test/test_extcall.py +++ b/Lib/test/test_extcall.py @@ -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 diff --git a/Lib/test/test_keywordonlyarg.py b/Lib/test/test_keywordonlyarg.py index 6a88b3d..bdcc4c6 100644 --- a/Lib/test/test_keywordonlyarg.py +++ b/Lib/test/test_keywordonlyarg.py @@ -73,6 +73,14 @@ class KeywordOnlyArgTestCase(unittest.TestCase): fundef3 += "lastarg):\n pass\n" compile(fundef3, "", "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)") diff --git a/Misc/NEWS b/Misc/NEWS index c57ca2c..982ef70 100644 --- 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. diff --git a/Python/ceval.c b/Python/ceval.c index 2055acf..6e4911a 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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; } -- cgit v0.12