Author: Armin Rigo <[email protected]>
Branch:
Changeset: r44046:f74d09eaefe0
Date: 2011-05-09 17:14 +0200
http://bitbucket.org/pypy/pypy/changeset/f74d09eaefe0/
Log: Change details again on how the error messages like "function x
takes at most y arguments (z given)" are produced. Shut down a case
where the message was "takes exactly N arguments (N given)" for the
same N. Note that CPython 2.7 has cases where it produces such a
bogus message...
diff --git a/pypy/interpreter/argument.py b/pypy/interpreter/argument.py
--- a/pypy/interpreter/argument.py
+++ b/pypy/interpreter/argument.py
@@ -615,14 +615,11 @@
self.num_kwds = nkwds
def getmsg(self, fnname):
- args = None
- #args_w, kwds_w = args.unpack()
- nargs = self.num_args + self.num_kwds
n = self.expected_nargs
if n == 0:
- msg = "%s() takes no argument (%d given)" % (
+ msg = "%s() takes no arguments (%d given)" % (
fnname,
- nargs)
+ self.num_args + self.num_kwds)
else:
defcount = self.num_defaults
if defcount == 0 and not self.has_vararg:
@@ -636,12 +633,17 @@
plural = ""
else:
plural = "s"
- msg = "%s() takes %s %d argument%s (%d given)" % (
+ if self.has_kwarg or self.num_kwds > 0:
+ msg2 = " non-keyword"
+ else:
+ msg2 = ""
+ msg = "%s() takes %s %d%s argument%s (%d given)" % (
fnname,
msg1,
n,
+ msg2,
plural,
- nargs)
+ self.num_args)
return msg
class ArgErrMultipleValues(ArgErr):
diff --git a/pypy/interpreter/test/test_argument.py
b/pypy/interpreter/test/test_argument.py
--- a/pypy/interpreter/test/test_argument.py
+++ b/pypy/interpreter/test/test_argument.py
@@ -512,25 +512,34 @@
# defaults_w, missing_args
err = ArgErrCount(1, 0, 0, False, False, None, 0)
s = err.getmsg('foo')
- assert s == "foo() takes no argument (1 given)"
+ assert s == "foo() takes no arguments (1 given)"
err = ArgErrCount(0, 0, 1, False, False, [], 1)
s = err.getmsg('foo')
assert s == "foo() takes exactly 1 argument (0 given)"
err = ArgErrCount(3, 0, 2, False, False, [], 0)
s = err.getmsg('foo')
assert s == "foo() takes exactly 2 arguments (3 given)"
+ err = ArgErrCount(3, 0, 2, False, False, ['a'], 0)
+ s = err.getmsg('foo')
+ assert s == "foo() takes at most 2 arguments (3 given)"
err = ArgErrCount(1, 0, 2, True, False, [], 1)
s = err.getmsg('foo')
assert s == "foo() takes at least 2 arguments (1 given)"
- err = ArgErrCount(3, 0, 2, True, False, ['a'], 0)
- s = err.getmsg('foo')
- assert s == "foo() takes at most 2 arguments (3 given)"
err = ArgErrCount(0, 1, 2, True, False, ['a'], 1)
s = err.getmsg('foo')
- assert s == "foo() takes at least 1 argument (1 given)"
+ assert s == "foo() takes at least 1 non-keyword argument (0 given)"
err = ArgErrCount(2, 1, 1, False, True, [], 0)
s = err.getmsg('foo')
- assert s == "foo() takes exactly 1 argument (3 given)"
+ assert s == "foo() takes exactly 1 non-keyword argument (2 given)"
+ err = ArgErrCount(0, 1, 1, False, True, [], 1)
+ s = err.getmsg('foo')
+ assert s == "foo() takes exactly 1 non-keyword argument (0 given)"
+ err = ArgErrCount(0, 1, 1, True, True, [], 1)
+ s = err.getmsg('foo')
+ assert s == "foo() takes at least 1 non-keyword argument (0 given)"
+ err = ArgErrCount(2, 1, 1, False, True, ['a'], 0)
+ s = err.getmsg('foo')
+ assert s == "foo() takes at most 1 non-keyword argument (2 given)"
def test_bad_type_for_star(self):
space = self.space
@@ -565,15 +574,15 @@
class AppTestArgument:
def test_error_message(self):
exc = raises(TypeError, (lambda a, b=2: 0), b=3)
- assert exc.value.message == "<lambda>() takes at least 1 argument (1
given)"
+ assert exc.value.message == "<lambda>() takes at least 1 non-keyword
argument (0 given)"
exc = raises(TypeError, (lambda: 0), b=3)
- assert exc.value.message == "<lambda>() takes no argument (1 given)"
+ assert exc.value.message == "<lambda>() takes no arguments (1 given)"
exc = raises(TypeError, (lambda a, b: 0), 1, 2, 3, a=1)
- assert exc.value.message == "<lambda>() takes exactly 2 arguments (4
given)"
+ assert exc.value.message == "<lambda>() takes exactly 2 non-keyword
arguments (3 given)"
exc = raises(TypeError, (lambda a, b=1: 0), 1, 2, 3, a=1)
- assert exc.value.message == "<lambda>() takes at most 2 arguments (4
given)"
+ assert exc.value.message == "<lambda>() takes at most 2 non-keyword
arguments (3 given)"
exc = raises(TypeError, (lambda a, b=1, **kw: 0), 1, 2, 3)
- assert exc.value.message == "<lambda>() takes at most 2 arguments (3
given)"
+ assert exc.value.message == "<lambda>() takes at most 2 non-keyword
arguments (3 given)"
def make_arguments_for_translation(space, args_w, keywords_w={},
w_stararg=None, w_starstararg=None):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit