[Python-checkins] r79239 - in python/branches/py3k: Lib/test/test_extcall.py Python/ceval.c

benjamin.peterson python-checkins at python.org
Sun Mar 21 22:00:50 CET 2010


Author: benjamin.peterson
Date: Sun Mar 21 22:00:50 2010
New Revision: 79239

Log:
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
........


Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Lib/test/test_extcall.py
   python/branches/py3k/Python/ceval.c

Modified: python/branches/py3k/Lib/test/test_extcall.py
==============================================================================
--- python/branches/py3k/Lib/test/test_extcall.py	(original)
+++ python/branches/py3k/Lib/test/test_extcall.py	Sun Mar 21 22:00:50 2010
@@ -1,3 +1,4 @@
+
 """Doctest for method/function calls.
 
 We're going the use these types for extra testing
@@ -65,17 +66,17 @@
     >>> 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 @@
     ...     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()

Modified: python/branches/py3k/Python/ceval.c
==============================================================================
--- python/branches/py3k/Python/ceval.c	(original)
+++ python/branches/py3k/Python/ceval.c	Sun Mar 21 22:00:50 2010
@@ -3076,13 +3076,12 @@
 			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 @@
 			}
 			/* 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 @@
 					    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 @@
 			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 @@
 			}
 		}
 	}
-	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. */


More information about the Python-checkins mailing list