mirror of
https://github.com/python/cpython.git
synced 2024-11-26 03:14:27 +08:00
Merged revisions 79205,79219,79228,79230,79232-79233,79235,79237 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r79205 | benjamin.peterson | 2010-03-21 12:34:54 -0500 (Sun, 21 Mar 2010) | 1 line rewrite a bit ........ r79219 | benjamin.peterson | 2010-03-21 14:24:08 -0500 (Sun, 21 Mar 2010) | 1 line flatten condition ........ r79228 | benjamin.peterson | 2010-03-21 14:35:39 -0500 (Sun, 21 Mar 2010) | 1 line remove pointless condition ........ r79230 | benjamin.peterson | 2010-03-21 14:39:52 -0500 (Sun, 21 Mar 2010) | 1 line co_varnames is certainly a tuple, so let's not waste time finding out ........ r79232 | benjamin.peterson | 2010-03-21 14:54:56 -0500 (Sun, 21 Mar 2010) | 1 line fix import ........ r79233 | benjamin.peterson | 2010-03-21 14:56:37 -0500 (Sun, 21 Mar 2010) | 1 line don't write duplicate tests ........ r79235 | benjamin.peterson | 2010-03-21 15:21:00 -0500 (Sun, 21 Mar 2010) | 4 lines improve error message from passing inadequate number of keyword arguments #6474 Note this removes the "non-keyword" or "keyword" phrases from these messages. ........ r79237 | benjamin.peterson | 2010-03-21 15:30:30 -0500 (Sun, 21 Mar 2010) | 1 line take into account keyword arguments when passing too many args ........
This commit is contained in:
parent
7a61ba9f0b
commit
a567a7796b
@ -1,3 +1,4 @@
|
||||
|
||||
"""Doctest for method/function calls.
|
||||
|
||||
We're going the use these types for extra testing
|
||||
@ -65,17 +66,17 @@ Verify clearing of SF bug #733667
|
||||
>>> g()
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: g() takes at least 1 positional argument (0 given)
|
||||
TypeError: g() takes at least 1 argument (0 given)
|
||||
|
||||
>>> g(*())
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: g() takes at least 1 positional argument (0 given)
|
||||
TypeError: g() takes at least 1 argument (0 given)
|
||||
|
||||
>>> g(*(), **{})
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: g() takes at least 1 positional argument (0 given)
|
||||
TypeError: g() takes at least 1 argument (0 given)
|
||||
|
||||
>>> g(1)
|
||||
1 () {}
|
||||
@ -261,13 +262,31 @@ the function call setup. See <http://bugs.python.org/issue2016>.
|
||||
... print(a,b)
|
||||
>>> f(**x)
|
||||
1 2
|
||||
|
||||
A obscure message:
|
||||
|
||||
>>> def f(a, b):
|
||||
... pass
|
||||
>>> f(b=1)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: f() takes exactly 2 arguments (1 given)
|
||||
|
||||
The number of arguments passed in includes keywords:
|
||||
|
||||
>>> def f(a):
|
||||
... pass
|
||||
>>> f(6, a=4, *(1, 2, 3))
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
TypeError: f() takes exactly 1 argument (5 given)
|
||||
"""
|
||||
|
||||
import sys
|
||||
from test import support
|
||||
|
||||
def test_main():
|
||||
from test import test_extcall # self import
|
||||
support.run_doctest(test_extcall, True)
|
||||
support.run_doctest(sys.modules[__name__], True)
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_main()
|
||||
|
@ -3076,13 +3076,12 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
|
||||
if (!(co->co_flags & CO_VARARGS)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%U() takes %s %d "
|
||||
"%spositional argument%s (%d given)",
|
||||
"argument%s (%d given)",
|
||||
co->co_name,
|
||||
defcount ? "at most" : "exactly",
|
||||
co->co_argcount,
|
||||
kwcount ? "non-keyword " : "",
|
||||
co->co_argcount == 1 ? "" : "s",
|
||||
argcount);
|
||||
argcount + kwcount);
|
||||
goto fail;
|
||||
}
|
||||
n = co->co_argcount;
|
||||
@ -3116,7 +3115,7 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
|
||||
}
|
||||
/* Speed hack: do raw pointer compares. As names are
|
||||
normally interned this should almost always hit. */
|
||||
co_varnames = PySequence_Fast_ITEMS(co->co_varnames);
|
||||
co_varnames = ((PyTupleObject *)(co->co_varnames))->ob_item;
|
||||
for (j = 0;
|
||||
j < co->co_argcount + co->co_kwonlyargcount;
|
||||
j++) {
|
||||
@ -3148,10 +3147,10 @@ PyEval_EvalCodeEx(PyCodeObject *co, PyObject *globals, PyObject *locals,
|
||||
keyword);
|
||||
goto fail;
|
||||
}
|
||||
PyDict_SetItem(kwdict, keyword, value);
|
||||
continue;
|
||||
}
|
||||
kw_found:
|
||||
PyDict_SetItem(kwdict, keyword, value);
|
||||
continue;
|
||||
kw_found:
|
||||
if (GETLOCAL(j) != NULL) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%U() got multiple "
|
||||
@ -3190,16 +3189,19 @@ kw_found:
|
||||
int m = co->co_argcount - defcount;
|
||||
for (i = argcount; i < m; i++) {
|
||||
if (GETLOCAL(i) == NULL) {
|
||||
int j, given = 0;
|
||||
for (j = 0; j < co->co_argcount; j++)
|
||||
if (GETLOCAL(j))
|
||||
given++;
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%U() takes %s %d "
|
||||
"%spositional argument%s "
|
||||
"argument%s "
|
||||
"(%d given)",
|
||||
co->co_name,
|
||||
((co->co_flags & CO_VARARGS) ||
|
||||
defcount) ? "at least"
|
||||
: "exactly",
|
||||
m, kwcount ? "non-keyword " : "",
|
||||
m == 1 ? "" : "s", i);
|
||||
m, m == 1 ? "" : "s", given);
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
@ -3216,14 +3218,12 @@ kw_found:
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (argcount > 0 || kwcount > 0) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%U() takes no arguments (%d given)",
|
||||
co->co_name,
|
||||
argcount + kwcount);
|
||||
goto fail;
|
||||
}
|
||||
else if (argcount > 0 || kwcount > 0) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"%U() takes no arguments (%d given)",
|
||||
co->co_name,
|
||||
argcount + kwcount);
|
||||
goto fail;
|
||||
}
|
||||
/* Allocate and initialize storage for cell vars, and copy free
|
||||
vars into frame. This isn't too efficient right now. */
|
||||
|
Loading…
Reference in New Issue
Block a user