[Python-checkins] r70305 - in python/trunk: Doc/library/warnings.rst Lib/test/test_warnings.py Lib/warnings.py Misc/NEWS Python/_warnings.c

brett.cannon python-checkins at python.org
Wed Mar 11 05:51:06 CET 2009


Author: brett.cannon
Date: Wed Mar 11 05:51:06 2009
New Revision: 70305

Log:
Require implementations for warnings.showwarning() support the 'line' argument.
Was a DeprecationWarning for not supporting it since Python 2.6.

Closes issue #3652.


Modified:
   python/trunk/Doc/library/warnings.rst
   python/trunk/Lib/test/test_warnings.py
   python/trunk/Lib/warnings.py
   python/trunk/Misc/NEWS
   python/trunk/Python/_warnings.c

Modified: python/trunk/Doc/library/warnings.rst
==============================================================================
--- python/trunk/Doc/library/warnings.rst	(original)
+++ python/trunk/Doc/library/warnings.rst	Wed Mar 11 05:51:06 2009
@@ -291,9 +291,8 @@
    message; if *line* is not supplied, :func:`showwarning` will
    try to read the line specified by *filename* and *lineno*.
 
-   .. versionchanged:: 2.6
-      Added the *line* argument. Implementations that lack the new argument
-      will trigger a :exc:`DeprecationWarning`.
+   .. versionchanged:: 2.7
+      The *line* argument is required to be supported.
 
 
 .. function:: formatwarning(message, category, filename, lineno[, line])

Modified: python/trunk/Lib/test/test_warnings.py
==============================================================================
--- python/trunk/Lib/test/test_warnings.py	(original)
+++ python/trunk/Lib/test/test_warnings.py	Wed Mar 11 05:51:06 2009
@@ -605,41 +605,6 @@
     module = py_warnings
 
 
-class ShowwarningDeprecationTests(BaseTest):
-
-    """Test the deprecation of the old warnings.showwarning() API works."""
-
-    @staticmethod
-    def bad_showwarning(message, category, filename, lineno, file=None):
-        pass
-
-    @staticmethod
-    def ok_showwarning(*args):
-        pass
-
-    def test_deprecation(self):
-        # message, category, filename, lineno[, file[, line]]
-        args = ("message", UserWarning, "file name", 42)
-        with original_warnings.catch_warnings(module=self.module):
-            self.module.filterwarnings("error", category=DeprecationWarning)
-            self.module.showwarning = self.bad_showwarning
-            self.assertRaises(DeprecationWarning, self.module.warn_explicit,
-                                *args)
-            self.module.showwarning = self.ok_showwarning
-            try:
-                self.module.warn_explicit(*args)
-            except DeprecationWarning as exc:
-                self.fail('showwarning(*args) should not trigger a '
-                            'DeprecationWarning')
-
-class CShowwarningDeprecationTests(ShowwarningDeprecationTests):
-    module = c_warnings
-
-
-class PyShowwarningDeprecationTests(ShowwarningDeprecationTests):
-    module = py_warnings
-
-
 def test_main():
     py_warnings.onceregistry.clear()
     c_warnings.onceregistry.clear()
@@ -649,8 +614,6 @@
                                 _WarningsTests,
                                 CWarningsDisplayTests, PyWarningsDisplayTests,
                                 CCatchWarningTests, PyCatchWarningTests,
-                                CShowwarningDeprecationTests,
-                                    PyShowwarningDeprecationTests,
                              )
 
 

Modified: python/trunk/Lib/warnings.py
==============================================================================
--- python/trunk/Lib/warnings.py	(original)
+++ python/trunk/Lib/warnings.py	Wed Mar 11 05:51:06 2009
@@ -262,24 +262,6 @@
         raise RuntimeError(
               "Unrecognized action (%r) in warnings.filters:\n %s" %
               (action, item))
-    # Warn if showwarning() does not support the 'line' argument.
-    # Don't use 'inspect' as it relies on an extension module, which break the
-    # build thanks to 'warnings' being imported by setup.py.
-    fxn_code = None
-    if hasattr(showwarning, 'func_code'):
-        fxn_code = showwarning.func_code
-    elif hasattr(showwarning, '__func__'):
-        fxn_code = showwarning.__func__.func_code
-    if fxn_code:
-        args = fxn_code.co_varnames[:fxn_code.co_argcount]
-        CO_VARARGS = 0x4
-        if 'line' not in args and not fxn_code.co_flags & CO_VARARGS:
-            showwarning_msg = ("functions overriding warnings.showwarning() "
-                                "must support the 'line' argument")
-            if message == showwarning_msg:
-                _show_warning(message, category, filename, lineno)
-            else:
-                warn(showwarning_msg, DeprecationWarning)
     # Print message and context
     showwarning(message, category, filename, lineno)
 

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Wed Mar 11 05:51:06 2009
@@ -12,6 +12,9 @@
 Core and Builtins
 -----------------
 
+- Issue #3652: Make the 'line' argument for warnings.showwarning() a
+  requirement.  Means the DeprecationWarning from Python 2.6 can go away.
+
 - Issue #5247: Improve error message when unknown format codes are
   used when using str.format() with str, unicode, long, int, and
   float arguments.

Modified: python/trunk/Python/_warnings.c
==============================================================================
--- python/trunk/Python/_warnings.c	(original)
+++ python/trunk/Python/_warnings.c	Wed Mar 11 05:51:06 2009
@@ -1,5 +1,4 @@
 #include "Python.h"
-#include "code.h"  /* For DeprecationWarning about adding 'line'. */
 #include "frameobject.h"
 
 #define MODULE_NAME "_warnings"
@@ -387,54 +386,23 @@
             show_warning(filename, lineno, text, category, sourceline);
         }
         else {
-            const char *msg = "functions overriding warnings.showwarning() "
-                                "must support the 'line' argument";
-            const char *text_char = PyString_AS_STRING(text);
-
-            if (strcmp(msg, text_char) == 0) {
-                /* Prevent infinite recursion by using built-in implementation
-                   of showwarning(). */
-                show_warning(filename, lineno, text, category, sourceline);
-            }
-            else {
-                PyObject *check_fxn;
-                PyObject *defaults;
-                PyObject *res;
-
-                if (PyMethod_Check(show_fxn))
-                    check_fxn = PyMethod_Function(show_fxn);
-                else if (PyFunction_Check(show_fxn))
-                    check_fxn = show_fxn;
-                else {
-                    PyErr_SetString(PyExc_TypeError,
-                                    "warnings.showwarning() must be set to a "
-                                    "function or method");
-                    Py_DECREF(show_fxn);
-                    goto cleanup;
-                }
+              PyObject *res;
 
-                defaults = PyFunction_GetDefaults(check_fxn);
-                /* A proper implementation of warnings.showwarning() should
-                    have at least two default arguments. */
-                if ((defaults == NULL) || (PyTuple_Size(defaults) < 2)) {
-	            PyCodeObject *code = (PyCodeObject *)
-						PyFunction_GetCode(check_fxn);
-		    if (!(code->co_flags & CO_VARARGS)) {
-		        if (PyErr_WarnEx(PyExc_DeprecationWarning, msg, 1) <
-				0) {
-                            Py_DECREF(show_fxn);
-                            goto cleanup;
-                        }
-                    }
-		}
-                res = PyObject_CallFunctionObjArgs(show_fxn, message, category,
-                                                    filename, lineno_obj,
-                                                    NULL);
-                Py_DECREF(show_fxn);
-                Py_XDECREF(res);
-                if (res == NULL)
-                    goto cleanup;
-            }
+              if (!PyMethod_Check(show_fxn) && !PyFunction_Check(show_fxn)) {
+                  PyErr_SetString(PyExc_TypeError,
+                                  "warnings.showwarning() must be set to a "
+                                  "function or method");
+                  Py_DECREF(show_fxn);
+                  goto cleanup;
+              }
+
+              res = PyObject_CallFunctionObjArgs(show_fxn, message, category,
+                                                  filename, lineno_obj,
+                                                  NULL);
+              Py_DECREF(show_fxn);
+              Py_XDECREF(res);
+              if (res == NULL)
+                  goto cleanup;
         }
     }
     else /* if (rc == -1) */


More information about the Python-checkins mailing list