[Python-checkins] r77220 - in python/branches/py3k: Lib/test/test_getargs2.py Misc/NEWS Python/getargs.c

mark.dickinson python-checkins at python.org
Fri Jan 1 20:27:33 CET 2010


Author: mark.dickinson
Date: Fri Jan  1 20:27:32 2010
New Revision: 77220

Log:
Merged revisions 77218 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r77218 | mark.dickinson | 2010-01-01 17:27:30 +0000 (Fri, 01 Jan 2010) | 5 lines
  
  Issue #5080: turn the DeprecationWarning from float arguments passed
  to integer PyArg_Parse* format codes into a TypeError.  Add a
  DeprecationWarning for floats passed with the 'L' format code, which
  didn't previously have a warning.
........


Modified:
   python/branches/py3k/   (props changed)
   python/branches/py3k/Lib/test/test_getargs2.py
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/Python/getargs.c

Modified: python/branches/py3k/Lib/test/test_getargs2.py
==============================================================================
--- python/branches/py3k/Lib/test/test_getargs2.py	(original)
+++ python/branches/py3k/Lib/test/test_getargs2.py	Fri Jan  1 20:27:32 2010
@@ -1,16 +1,7 @@
 import unittest
 from test import support
 from _testcapi import getargs_keywords
-
 import warnings
-warnings.filterwarnings("ignore",
-                        category=DeprecationWarning,
-                        message=".*integer argument expected, got float",
-                        module=__name__)
-warnings.filterwarnings("ignore",
-                        category=DeprecationWarning,
-                        message=".*integer argument expected, got float",
-                        module="unittest")
 
 """
 > How about the following counterproposal. This also changes some of
@@ -197,9 +188,24 @@
 class LongLong_TestCase(unittest.TestCase):
     def test_L(self):
         from _testcapi import getargs_L
-        # L returns 'long long', and does range checking (LLONG_MIN ... LLONG_MAX)
+        # L returns 'long long', and does range checking (LLONG_MIN
+        # ... LLONG_MAX)
+        with warnings.catch_warnings():
+            warnings.filterwarnings(
+                "ignore",
+                category=DeprecationWarning,
+                message=".*integer argument expected, got float",
+                module=__name__)
+            self.assertEqual(3, getargs_L(3.14))
+        with warnings.catch_warnings():
+            warnings.filterwarnings(
+                "error",
+                category=DeprecationWarning,
+                message=".*integer argument expected, got float",
+                module="unittest")
+            self.assertRaises(DeprecationWarning, getargs_L, 3.14)
+
         self.assertRaises(TypeError, getargs_L, "Hello")
-        self.assertEqual(3, getargs_L(3.14))
         self.assertEqual(99, getargs_L(Int()))
 
         self.assertRaises(OverflowError, getargs_L, LLONG_MIN-1)

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Fri Jan  1 20:27:32 2010
@@ -146,6 +146,13 @@
 C-API
 -----
 
+- Issue #5080: The argument parsing functions PyArg_ParseTuple,
+  PyArg_ParseTupleAndKeywords, PyArg_VaParse,
+  PyArg_VaParseTupleAndKeywords and PyArg_Parse now raise a
+  DeprecationWarning for float arguments passed with the 'L' format
+  code.  This will become a TypeError in a future version of Python,
+  to match the behaviour of the other integer format codes.
+
 - Issue #7033: function ``PyErr_NewExceptionWithDoc()`` added.
 
 - Issue #7414: 'C' code wasn't being skipped properly (for keyword arguments)

Modified: python/branches/py3k/Python/getargs.c
==============================================================================
--- python/branches/py3k/Python/getargs.c	(original)
+++ python/branches/py3k/Python/getargs.c	Fri Jan  1 20:27:32 2010
@@ -582,6 +582,19 @@
 
 #define CONV_UNICODE "(unicode conversion error)"
 
+/* explicitly check for float arguments when integers are expected.  For now
+ * signal a warning.  Returns true if an exception was raised. */
+static int
+float_argument_warning(PyObject *arg)
+{
+	if (PyFloat_Check(arg) &&
+	    PyErr_Warn(PyExc_DeprecationWarning,
+		       "integer argument expected, got float" ))
+		return 1;
+	else
+		return 0;
+}
+
 /* Explicitly check for float arguments when integers are expected.
    Return 1 for error, 0 if ok. */
 static int
@@ -777,7 +790,10 @@
 #ifdef HAVE_LONG_LONG
 	case 'L': {/* PY_LONG_LONG */
 		PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * );
-		PY_LONG_LONG ival = PyLong_AsLongLong( arg );
+		PY_LONG_LONG ival;
+		if (float_argument_warning(arg))
+			return converterr("long<L>", arg, msgbuf, bufsize);
+		ival = PyLong_AsLongLong(arg);
 		if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred() ) {
 			return converterr("long<L>", arg, msgbuf, bufsize);
 		} else {


More information about the Python-checkins mailing list