[Python-checkins] r85824 - in python/branches/py3k: Doc/library/exceptions.rst Doc/library/gc.rst Doc/library/warnings.rst Include/pyerrors.h Lib/test/exception_hierarchy.txt Lib/test/test_gc.py Lib/warnings.py Misc/NEWS Modules/gcmodule.c Objects/exceptions.c Python/_warnings.c Python/errors.c

georg.brandl python-checkins at python.org
Sun Oct 24 17:11:22 CEST 2010


Author: georg.brandl
Date: Sun Oct 24 17:11:22 2010
New Revision: 85824
Log:
Add a new warning gategory, ResourceWarning, as discussed on python-dev. It is silent by default,
except when configured --with-pydebug.
Emit this warning from the GC shutdown procedure, rather than just printing to stderr.
Modified:
 python/branches/py3k/Doc/library/exceptions.rst
 python/branches/py3k/Doc/library/gc.rst
 python/branches/py3k/Doc/library/warnings.rst
 python/branches/py3k/Include/pyerrors.h
 python/branches/py3k/Lib/test/exception_hierarchy.txt
 python/branches/py3k/Lib/test/test_gc.py
 python/branches/py3k/Lib/warnings.py
 python/branches/py3k/Misc/NEWS
 python/branches/py3k/Modules/gcmodule.c
 python/branches/py3k/Objects/exceptions.c
 python/branches/py3k/Python/_warnings.c
 python/branches/py3k/Python/errors.c
Modified: python/branches/py3k/Doc/library/exceptions.rst
==============================================================================
--- python/branches/py3k/Doc/library/exceptions.rst	(original)
+++ python/branches/py3k/Doc/library/exceptions.rst	Sun Oct 24 17:11:22 2010
@@ -410,10 +410,20 @@
 
 Base class for warnings related to Unicode.
 
+
 .. exception:: BytesWarning
 
 Base class for warnings related to :class:`bytes` and :class:`buffer`.
 
+
+.. exception:: ResourceWarning
+
+ Base class for warnings related to resource usage.
+
+ .. versionadded:: 3.2
+
+
+
 Exception hierarchy
 -------------------
 
Modified: python/branches/py3k/Doc/library/gc.rst
==============================================================================
--- python/branches/py3k/Doc/library/gc.rst	(original)
+++ python/branches/py3k/Doc/library/gc.rst	Sun Oct 24 17:11:22 2010
@@ -174,17 +174,15 @@
 with :meth:`__del__` methods, and *garbage* can be examined in that case to
 verify that no such cycles are being created.
 
- If :const:`DEBUG_SAVEALL` is set, then all unreachable objects will be added to
- this list rather than freed.
+ If :const:`DEBUG_SAVEALL` is set, then all unreachable objects will be added
+ to this list rather than freed.
 
 .. versionchanged:: 3.2
- If this list is non-empty at interpreter shutdown, a warning message
- gets printed.
+ If this list is non-empty at interpreter shutdown, a
+ :exc:`ResourceWarning` is emitted, which is silent by default. If
+ :const:`DEBUG_UNCOLLECTABLE` is set, in addition all uncollectable objects
+ are printed.
 
- ::
-
- gc: 2 uncollectable objects at shutdown:
- Use gc.set_debug(gc.DEBUG_UNCOLLECTABLE) to list them.
 
 The following constants are provided for use with :func:`set_debug`:
 
@@ -203,12 +201,12 @@
 .. data:: DEBUG_UNCOLLECTABLE
 
 Print information of uncollectable objects found (objects which are not
- reachable but cannot be freed by the collector). These objects will be added to
- the ``garbage`` list.
+ reachable but cannot be freed by the collector). These objects will be added
+ to the ``garbage`` list.
 
 .. versionchanged:: 3.2
 Also print the contents of the :data:`garbage` list at interpreter
- shutdown (rather than just its length), if it isn't empty.
+ shutdown, if it isn't empty.
 
 .. data:: DEBUG_SAVEALL
 
Modified: python/branches/py3k/Doc/library/warnings.rst
==============================================================================
--- python/branches/py3k/Doc/library/warnings.rst	(original)
+++ python/branches/py3k/Doc/library/warnings.rst	Sun Oct 24 17:11:22 2010
@@ -82,6 +82,9 @@
 | :exc:`BytesWarning` | Base category for warnings related to |
 | | :class:`bytes` and :class:`buffer`. |
 +----------------------------------+-----------------------------------------------+
+| :exc:`ResourceWarning` | Base category for warnings related to |
+| | resource usage. |
++----------------------------------+-----------------------------------------------+
 
 
 While these are technically built-in exceptions, they are documented here,
Modified: python/branches/py3k/Include/pyerrors.h
==============================================================================
--- python/branches/py3k/Include/pyerrors.h	(original)
+++ python/branches/py3k/Include/pyerrors.h	Sun Oct 24 17:11:22 2010
@@ -170,6 +170,7 @@
 PyAPI_DATA(PyObject *) PyExc_ImportWarning;
 PyAPI_DATA(PyObject *) PyExc_UnicodeWarning;
 PyAPI_DATA(PyObject *) PyExc_BytesWarning;
+PyAPI_DATA(PyObject *) PyExc_ResourceWarning;
 
 
 /* Convenience functions */
Modified: python/branches/py3k/Lib/test/exception_hierarchy.txt
==============================================================================
--- python/branches/py3k/Lib/test/exception_hierarchy.txt	(original)
+++ python/branches/py3k/Lib/test/exception_hierarchy.txt	Sun Oct 24 17:11:22 2010
@@ -47,3 +47,4 @@
 +-- ImportWarning
 +-- UnicodeWarning
 +-- BytesWarning
+ +-- ResourceWarning
Modified: python/branches/py3k/Lib/test/test_gc.py
==============================================================================
--- python/branches/py3k/Lib/test/test_gc.py	(original)
+++ python/branches/py3k/Lib/test/test_gc.py	Sun Oct 24 17:11:22 2010
@@ -485,7 +485,7 @@
 gc.set_debug(%s)
 """
 def run_command(code):
- p = subprocess.Popen([sys.executable, "-c", code],
+ p = subprocess.Popen([sys.executable, "-Wd", "-c", code],
 stdout=subprocess.PIPE,
 stderr=subprocess.PIPE)
 stdout, stderr = p.communicate()
@@ -494,11 +494,13 @@
 return strip_python_stderr(stderr)
 
 stderr = run_command(code % "0")
- self.assertIn(b"gc: 2 uncollectable objects at shutdown", stderr)
+ self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at "
+ b"shutdown; use", stderr)
 self.assertNotIn(b"<X 'first'>", stderr)
 # With DEBUG_UNCOLLECTABLE, the garbage list gets printed
 stderr = run_command(code % "gc.DEBUG_UNCOLLECTABLE")
- self.assertIn(b"gc: 2 uncollectable objects at shutdown", stderr)
+ self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at "
+ b"shutdown", stderr)
 self.assertTrue(
 (b"[<X 'first'>, <X 'second'>]" in stderr) or
 (b"[<X 'second'>, <X 'first'>]" in stderr), stderr)
Modified: python/branches/py3k/Lib/warnings.py
==============================================================================
--- python/branches/py3k/Lib/warnings.py	(original)
+++ python/branches/py3k/Lib/warnings.py	Sun Oct 24 17:11:22 2010
@@ -383,4 +383,11 @@
 else:
 bytes_action = "ignore"
 simplefilter(bytes_action, category=BytesWarning, append=1)
+ # resource usage warnings are enabled by default in pydebug mode
+ if hasattr(sys, 'gettotalrefcount'):
+ resource_action = "always"
+ else:
+ resource_action = "ignore"
+ simplefilter(resource_action, category=ResourceWarning, append=1)
+
 del _warnings_defaults
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Sun Oct 24 17:11:22 2010
@@ -691,7 +691,7 @@
 - Issue #8524: Add a detach() method to socket objects, so as to put the socket
 into the closed state without closing the underlying file descriptor.
 
-- Issue #477863: Print a warning at shutdown if gc.garbage is not empty.
+- Issue #477863: Emit a ResourceWarning at shutdown if gc.garbage is not empty.
 
 - Issue #6869: Fix a refcount problem in the _ctypes extension.
 
Modified: python/branches/py3k/Modules/gcmodule.c
==============================================================================
--- python/branches/py3k/Modules/gcmodule.c	(original)
+++ python/branches/py3k/Modules/gcmodule.c	Sun Oct 24 17:11:22 2010
@@ -1368,11 +1368,16 @@
 {
 if (!(debug & DEBUG_SAVEALL)
 && garbage != NULL && PyList_GET_SIZE(garbage) > 0) {
- PySys_WriteStderr(
- "gc: "
- "%" PY_FORMAT_SIZE_T "d uncollectable objects at shutdown:\n",
- PyList_GET_SIZE(garbage)
- );
+ char *message;
+ if (debug & DEBUG_UNCOLLECTABLE)
+ message = "gc: %" PY_FORMAT_SIZE_T "d uncollectable objects at " \
+ "shutdown";
+ else
+ message = "gc: %" PY_FORMAT_SIZE_T "d uncollectable objects at " \
+ "shutdown; use gc.set_debug(gc.DEBUG_UNCOLLECTABLE) to list them";
+ if (PyErr_WarnFormat(PyExc_ResourceWarning, 0, message,
+ PyList_GET_SIZE(garbage)) < 0)
+ PyErr_WriteUnraisable(NULL);
 if (debug & DEBUG_UNCOLLECTABLE) {
 PyObject *repr = NULL, *bytes = NULL;
 repr = PyObject_Repr(garbage);
@@ -1387,11 +1392,6 @@
 Py_XDECREF(repr);
 Py_XDECREF(bytes);
 }
- else {
- PySys_WriteStderr(
- " Use gc.set_debug(gc.DEBUG_UNCOLLECTABLE) to list them.\n"
- );
- }
 }
 }
 
Modified: python/branches/py3k/Objects/exceptions.c
==============================================================================
--- python/branches/py3k/Objects/exceptions.c	(original)
+++ python/branches/py3k/Objects/exceptions.c	Sun Oct 24 17:11:22 2010
@@ -1852,6 +1852,7 @@
 "Base class for warnings about Unicode related problems, mostly\n"
 "related to conversion problems.");
 
+
 /*
 * BytesWarning extends Warning
 */
@@ -1860,6 +1861,13 @@
 "related to conversion from str or comparing to str.");
 
 
+/*
+ * ResourceWarning extends Warning
+ */
+SimpleExtendsException(PyExc_Warning, ResourceWarning,
+ "Base class for warnings about resource usage.");
+
+
 
 /* Pre-computed MemoryError instance. Best to create this as early as
 * possible and not wait until a MemoryError is actually raised!
@@ -1939,6 +1947,7 @@
 PRE_INIT(ImportWarning)
 PRE_INIT(UnicodeWarning)
 PRE_INIT(BytesWarning)
+ PRE_INIT(ResourceWarning)
 
 bltinmod = PyImport_ImportModule("builtins");
 if (bltinmod == NULL)
@@ -2001,6 +2010,7 @@
 POST_INIT(ImportWarning)
 POST_INIT(UnicodeWarning)
 POST_INIT(BytesWarning)
+ POST_INIT(ResourceWarning)
 
 PyExc_MemoryErrorInst = BaseException_new(&_PyExc_MemoryError, NULL, NULL);
 if (!PyExc_MemoryErrorInst)
Modified: python/branches/py3k/Python/_warnings.c
==============================================================================
--- python/branches/py3k/Python/_warnings.c	(original)
+++ python/branches/py3k/Python/_warnings.c	Sun Oct 24 17:11:22 2010
@@ -835,6 +835,7 @@
 static PyObject *ignore_str = NULL;
 static PyObject *error_str = NULL;
 static PyObject *default_str = NULL;
+ static PyObject *always_str = NULL;
 PyObject *action_obj = NULL;
 PyObject *lineno, *result;
 
@@ -862,6 +863,14 @@
 }
 action_obj = default_str;
 }
+ else if (!strcmp(action, "always")) {
+ if (always_str == NULL) {
+ always_str = PyUnicode_InternFromString("always");
+ if (always_str == NULL)
+ return NULL;
+ }
+ action_obj = always_str;
+ }
 else {
 Py_FatalError("unknown action");
 }
@@ -879,10 +888,10 @@
 init_filters(void)
 {
 /* Don't silence DeprecationWarning if -3 was used. */
- PyObject *filters = PyList_New(4);
+ PyObject *filters = PyList_New(5);
 unsigned int pos = 0; /* Post-incremented in each use. */
 unsigned int x;
- const char *bytes_action;
+ const char *bytes_action, *resource_action;
 
 if (filters == NULL)
 return NULL;
@@ -901,7 +910,14 @@
 bytes_action = "ignore";
 PyList_SET_ITEM(filters, pos++, create_filter(PyExc_BytesWarning,
 bytes_action));
-
+ /* resource usage warnings are enabled by default in pydebug mode */
+#ifdef Py_DEBUG
+ resource_action = "always";
+#else
+ resource_action = "ignore";
+#endif
+ PyList_SET_ITEM(filters, pos++, create_filter(PyExc_ResourceWarning,
+ resource_action));
 for (x = 0; x < pos; x += 1) {
 if (PyList_GET_ITEM(filters, x) == NULL) {
 Py_DECREF(filters);
Modified: python/branches/py3k/Python/errors.c
==============================================================================
--- python/branches/py3k/Python/errors.c	(original)
+++ python/branches/py3k/Python/errors.c	Sun Oct 24 17:11:22 2010
@@ -767,8 +767,10 @@
 }
 Py_XDECREF(moduleName);
 }
- PyFile_WriteString(" in ", f);
- PyFile_WriteObject(obj, f, 0);
+ if (obj) {
+ PyFile_WriteString(" in ", f);
+ PyFile_WriteObject(obj, f, 0);
+ }
 PyFile_WriteString(" ignored\n", f);
 PyErr_Clear(); /* Just in case */
 }


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /