mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 9b99747386
			
		
	
	
		9b99747386
		
			
		
	
	
	
	
		
			
			- primary change is to add a new default filter entry for 'default::DeprecationWarning:__main__' - secondary change is an internal one to cope with plain strings in the warning module's internal filter list (this avoids the need to create a compiled regex object early on during interpreter startup) - assorted documentation updates, including many more examples of configuring the warnings settings - additional tests to ensure that both the pure Python and the C accelerated warnings modules have the expected default configuration
		
			
				
	
	
		
			516 lines
		
	
	
	
		
			23 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			516 lines
		
	
	
	
		
			23 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| :mod:`warnings` --- Warning control
 | |
| ===================================
 | |
| 
 | |
| .. module:: warnings
 | |
|    :synopsis: Issue warning messages and control their disposition.
 | |
| 
 | |
| **Source code:** :source:`Lib/warnings.py`
 | |
| 
 | |
| .. index:: single: warnings
 | |
| 
 | |
| --------------
 | |
| 
 | |
| Warning messages are typically issued in situations where it is useful to alert
 | |
| the user of some condition in a program, where that condition (normally) doesn't
 | |
| warrant raising an exception and terminating the program.  For example, one
 | |
| might want to issue a warning when a program uses an obsolete module.
 | |
| 
 | |
| Python programmers issue warnings by calling the :func:`warn` function defined
 | |
| in this module.  (C programmers use :c:func:`PyErr_WarnEx`; see
 | |
| :ref:`exceptionhandling` for details).
 | |
| 
 | |
| Warning messages are normally written to ``sys.stderr``, but their disposition
 | |
| can be changed flexibly, from ignoring all warnings to turning them into
 | |
| exceptions.  The disposition of warnings can vary based on the warning category
 | |
| (see below), the text of the warning message, and the source location where it
 | |
| is issued.  Repetitions of a particular warning for the same source location are
 | |
| typically suppressed.
 | |
| 
 | |
| There are two stages in warning control: first, each time a warning is issued, a
 | |
| determination is made whether a message should be issued or not; next, if a
 | |
| message is to be issued, it is formatted and printed using a user-settable hook.
 | |
| 
 | |
| The determination whether to issue a warning message is controlled by the
 | |
| warning filter, which is a sequence of matching rules and actions. Rules can be
 | |
| added to the filter by calling :func:`filterwarnings` and reset to its default
 | |
| state by calling :func:`resetwarnings`.
 | |
| 
 | |
| The printing of warning messages is done by calling :func:`showwarning`, which
 | |
| may be overridden; the default implementation of this function formats the
 | |
| message by calling :func:`formatwarning`, which is also available for use by
 | |
| custom implementations.
 | |
| 
 | |
| .. seealso::
 | |
|    :func:`logging.captureWarnings` allows you to handle all warnings with
 | |
|    the standard logging infrastructure.
 | |
| 
 | |
| 
 | |
| .. _warning-categories:
 | |
| 
 | |
| Warning Categories
 | |
| ------------------
 | |
| 
 | |
| There are a number of built-in exceptions that represent warning categories.
 | |
| This categorization is useful to be able to filter out groups of warnings.
 | |
| 
 | |
| While these are technically
 | |
| :ref:`built-in exceptions <warning-categories-as-exceptions>`, they are
 | |
| documented here, because conceptually they belong to the warnings mechanism.
 | |
| 
 | |
| User code can define additional warning categories by subclassing one of the
 | |
| standard warning categories.  A warning category must always be a subclass of
 | |
| the :exc:`Warning` class.
 | |
| 
 | |
| The following warnings category classes are currently defined:
 | |
| 
 | |
| .. tabularcolumns:: |l|p{0.6\linewidth}|
 | |
| 
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| | Class                            | Description                                   |
 | |
| +==================================+===============================================+
 | |
| | :exc:`Warning`                   | This is the base class of all warning         |
 | |
| |                                  | category classes.  It is a subclass of        |
 | |
| |                                  | :exc:`Exception`.                             |
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| | :exc:`UserWarning`               | The default category for :func:`warn`.        |
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| | :exc:`DeprecationWarning`        | Base category for warnings about deprecated   |
 | |
| |                                  | features when those warnings are intended for |
 | |
| |                                  | other Python developers (ignored by default,  |
 | |
| |                                  | unless triggered by code in ``__main__``).    |
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| | :exc:`SyntaxWarning`             | Base category for warnings about dubious      |
 | |
| |                                  | syntactic features.                           |
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| | :exc:`RuntimeWarning`            | Base category for warnings about dubious      |
 | |
| |                                  | runtime features.                             |
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| | :exc:`FutureWarning`             | Base category for warnings about deprecated   |
 | |
| |                                  | features when those warnings are intended for |
 | |
| |                                  | end users of applications that are written in |
 | |
| |                                  | Python.                                       |
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| | :exc:`PendingDeprecationWarning` | Base category for warnings about features     |
 | |
| |                                  | that will be deprecated in the future         |
 | |
| |                                  | (ignored by default).                         |
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| | :exc:`ImportWarning`             | Base category for warnings triggered during   |
 | |
| |                                  | the process of importing a module (ignored by |
 | |
| |                                  | default).                                     |
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| | :exc:`UnicodeWarning`            | Base category for warnings related to         |
 | |
| |                                  | Unicode.                                      |
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| | :exc:`BytesWarning`              | Base category for warnings related to         |
 | |
| |                                  | :class:`bytes` and :class:`bytearray`.        |
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| | :exc:`ResourceWarning`           | Base category for warnings related to         |
 | |
| |                                  | resource usage.                               |
 | |
| +----------------------------------+-----------------------------------------------+
 | |
| 
 | |
| .. versionchanged:: 3.7
 | |
|   Previously :exc:`DeprecationWarning` and :exc:`FutureWarning` were
 | |
|   distinguished based on whether a feature was being removed entirely or
 | |
|   changing its behaviour. They are now distinguished based on their
 | |
|   intended audience and the way they're handled by the default warnings
 | |
|   filters.
 | |
| 
 | |
| 
 | |
| .. _warning-filter:
 | |
| 
 | |
| The Warnings Filter
 | |
| -------------------
 | |
| 
 | |
| The warnings filter controls whether warnings are ignored, displayed, or turned
 | |
| into errors (raising an exception).
 | |
| 
 | |
| Conceptually, the warnings filter maintains an ordered list of filter
 | |
| specifications; any specific warning is matched against each filter
 | |
| specification in the list in turn until a match is found; the filter determines
 | |
| the disposition of the match.  Each entry is a tuple of the form (*action*,
 | |
| *message*, *category*, *module*, *lineno*), where:
 | |
| 
 | |
| * *action* is one of the following strings:
 | |
| 
 | |
|   +---------------+----------------------------------------------+
 | |
|   | Value         | Disposition                                  |
 | |
|   +===============+==============================================+
 | |
|   | ``"default"`` | print the first occurrence of matching       |
 | |
|   |               | warnings for each location (module +         |
 | |
|   |               | line number) where the warning is issued     |
 | |
|   +---------------+----------------------------------------------+
 | |
|   | ``"error"``   | turn matching warnings into exceptions       |
 | |
|   +---------------+----------------------------------------------+
 | |
|   | ``"ignore"``  | never print matching warnings                |
 | |
|   +---------------+----------------------------------------------+
 | |
|   | ``"always"``  | always print matching warnings               |
 | |
|   +---------------+----------------------------------------------+
 | |
|   | ``"module"``  | print the first occurrence of matching       |
 | |
|   |               | warnings for each module where the warning   |
 | |
|   |               | is issued (regardless of line number)        |
 | |
|   +---------------+----------------------------------------------+
 | |
|   | ``"once"``    | print only the first occurrence of matching  |
 | |
|   |               | warnings, regardless of location             |
 | |
|   +---------------+----------------------------------------------+
 | |
| 
 | |
| * *message* is a string containing a regular expression that the start of
 | |
|   the warning message must match.  The expression is compiled to always be
 | |
|   case-insensitive.
 | |
| 
 | |
| * *category* is a class (a subclass of :exc:`Warning`) of which the warning
 | |
|   category must be a subclass in order to match.
 | |
| 
 | |
| * *module* is a string containing a regular expression that the module name must
 | |
|   match.  The expression is compiled to be case-sensitive.
 | |
| 
 | |
| * *lineno* is an integer that the line number where the warning occurred must
 | |
|   match, or ``0`` to match all line numbers.
 | |
| 
 | |
| Since the :exc:`Warning` class is derived from the built-in :exc:`Exception`
 | |
| class, to turn a warning into an error we simply raise ``category(message)``.
 | |
| 
 | |
| If a warning is reported and doesn't match any registered filter then the
 | |
| "default" action is applied (hence its name).
 | |
| 
 | |
| 
 | |
| .. _describing-warning-filters:
 | |
| 
 | |
| Describing Warning Filters
 | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| The warnings filter is initialized by :option:`-W` options passed to the Python
 | |
| interpreter command line and the :envvar:`PYTHONWARNINGS` environment variable.
 | |
| The interpreter saves the arguments for all supplied entries without
 | |
| interpretation in ``sys.warnoptions``; the :mod:`warnings` module parses these
 | |
| when it is first imported (invalid options are ignored, after printing a
 | |
| message to ``sys.stderr``).
 | |
| 
 | |
| Individual warnings filters are specified as a sequence of fields separated by
 | |
| colons::
 | |
| 
 | |
|    action:message:category:module:line
 | |
| 
 | |
| The meaning of each of these fields is as described in :ref:`warning-filter`.
 | |
| When listing multiple filters on a single line (as for
 | |
| :envvar:`PYTHONWARNINGS`), the individual filters are separated by commas,and
 | |
| the filters listed later take precedence over those listed before them (as
 | |
| they're applied left-to-right, and the most recently applied filters take
 | |
| precedence over earlier ones).
 | |
| 
 | |
| Commonly used warning filters apply to either all warnings, warnings in a
 | |
| particular category, or warnings raised by particular modules or packages.
 | |
| Some examples::
 | |
| 
 | |
|    default                      # Show all warnings (even those ignored by default)
 | |
|    ignore                       # Ignore all warnings
 | |
|    error                        # Convert all warnings to errors
 | |
|    error::ResourceWarning       # Treat ResourceWarning messages as errors
 | |
|    default::DeprecationWarning  # Show DeprecationWarning messages
 | |
|    ignore,default:::mymodule    # Only report warnings triggered by "mymodule"
 | |
|    error:::mymodule[.*]         # Convert warnings to errors in "mymodule"
 | |
|                                 # and any subpackages of "mymodule"
 | |
| 
 | |
| 
 | |
| .. _default-warning-filter:
 | |
| 
 | |
| Default Warning Filter
 | |
| ~~~~~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| By default, Python installs several warning filters, which can be overridden by
 | |
| the :option:`-W` command-line option, the :envvar:`PYTHONWARNINGS` environment
 | |
| variable and calls to :func:`filterwarnings`.
 | |
| 
 | |
| In regular release builds, the default warning filter has the following entries
 | |
| (in order of precedence)::
 | |
| 
 | |
|     default::DeprecationWarning:__main__
 | |
|     ignore::DeprecationWarning
 | |
|     ignore::PendingDeprecationWarning
 | |
|     ignore::ImportWarning
 | |
|     ignore::ResourceWarning
 | |
| 
 | |
| In debug builds, the list of default warning filters is empty.
 | |
| 
 | |
| .. versionchanged:: 3.2
 | |
|    :exc:`DeprecationWarning` is now ignored by default in addition to
 | |
|    :exc:`PendingDeprecationWarning`.
 | |
| 
 | |
| .. versionchanged:: 3.7
 | |
|   :exc:`DeprecationWarning` is once again shown by default when triggered
 | |
|   directly by code in ``__main__``.
 | |
| 
 | |
| .. versionchanged:: 3.7
 | |
|   :exc:`BytesWarning` no longer appears in the default filter list and is
 | |
|   instead configured via :data:`sys.warnoptions` when :option:`-b` is specified
 | |
|   twice.
 | |
| 
 | |
| 
 | |
| .. _warning-disable:
 | |
| 
 | |
| Overriding the default filter
 | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| Developers of applications written in Python may wish to hide *all* Python level
 | |
| warnings from their users by default, and only display them when running tests
 | |
| or otherwise working on the application. The :data:`sys.warnoptions` attribute
 | |
| used to pass filter configurations to the interpreter can be used as a marker to
 | |
| indicate whether or not warnings should be disabled::
 | |
| 
 | |
|     import sys
 | |
| 
 | |
|     if not sys.warnoptions:
 | |
|         import warnings
 | |
|         warnings.simplefilter("ignore")
 | |
| 
 | |
| Developers of test runners for Python code are advised to instead ensure that
 | |
| *all* warnings are displayed by default for the code under test, using code
 | |
| like::
 | |
| 
 | |
|     import sys
 | |
| 
 | |
|     if not sys.warnoptions:
 | |
|         import os, warnings
 | |
|         warnings.simplefilter("default") # Change the filter in this process
 | |
|         os.environ["PYTHONWARNINGS"] = "default" # Also affect subprocesses
 | |
| 
 | |
| Finally, developers of interactive shells that run user code in a namespace
 | |
| other than ``__main__`` are advised to ensure that :exc:`DeprecationWarning`
 | |
| messages are made visible by default, using code like the following (where
 | |
| ``user_ns`` is the module used to execute code entered interactively)::
 | |
| 
 | |
|     import warnings
 | |
|     warnings.filterwarnings("default", category=DeprecationWarning,
 | |
|                                        module=user_ns.get("__name__"))
 | |
| 
 | |
| 
 | |
| .. _warning-suppress:
 | |
| 
 | |
| Temporarily Suppressing Warnings
 | |
| --------------------------------
 | |
| 
 | |
| If you are using code that you know will raise a warning, such as a deprecated
 | |
| function, but do not want to see the warning (even when warnings have been
 | |
| explicitly configured via the command line), then it is possible to suppress
 | |
| the warning using the :class:`catch_warnings` context manager::
 | |
| 
 | |
|     import warnings
 | |
| 
 | |
|     def fxn():
 | |
|         warnings.warn("deprecated", DeprecationWarning)
 | |
| 
 | |
|     with warnings.catch_warnings():
 | |
|         warnings.simplefilter("ignore")
 | |
|         fxn()
 | |
| 
 | |
| While within the context manager all warnings will simply be ignored. This
 | |
| allows you to use known-deprecated code without having to see the warning while
 | |
| not suppressing the warning for other code that might not be aware of its use
 | |
| of deprecated code.  Note: this can only be guaranteed in a single-threaded
 | |
| application. If two or more threads use the :class:`catch_warnings` context
 | |
| manager at the same time, the behavior is undefined.
 | |
| 
 | |
| 
 | |
| 
 | |
| .. _warning-testing:
 | |
| 
 | |
| Testing Warnings
 | |
| ----------------
 | |
| 
 | |
| To test warnings raised by code, use the :class:`catch_warnings` context
 | |
| manager. With it you can temporarily mutate the warnings filter to facilitate
 | |
| your testing. For instance, do the following to capture all raised warnings to
 | |
| check::
 | |
| 
 | |
|     import warnings
 | |
| 
 | |
|     def fxn():
 | |
|         warnings.warn("deprecated", DeprecationWarning)
 | |
| 
 | |
|     with warnings.catch_warnings(record=True) as w:
 | |
|         # Cause all warnings to always be triggered.
 | |
|         warnings.simplefilter("always")
 | |
|         # Trigger a warning.
 | |
|         fxn()
 | |
|         # Verify some things
 | |
|         assert len(w) == 1
 | |
|         assert issubclass(w[-1].category, DeprecationWarning)
 | |
|         assert "deprecated" in str(w[-1].message)
 | |
| 
 | |
| One can also cause all warnings to be exceptions by using ``error`` instead of
 | |
| ``always``. One thing to be aware of is that if a warning has already been
 | |
| raised because of a ``once``/``default`` rule, then no matter what filters are
 | |
| set the warning will not be seen again unless the warnings registry related to
 | |
| the warning has been cleared.
 | |
| 
 | |
| Once the context manager exits, the warnings filter is restored to its state
 | |
| when the context was entered. This prevents tests from changing the warnings
 | |
| filter in unexpected ways between tests and leading to indeterminate test
 | |
| results. The :func:`showwarning` function in the module is also restored to
 | |
| its original value.  Note: this can only be guaranteed in a single-threaded
 | |
| application. If two or more threads use the :class:`catch_warnings` context
 | |
| manager at the same time, the behavior is undefined.
 | |
| 
 | |
| When testing multiple operations that raise the same kind of warning, it
 | |
| is important to test them in a manner that confirms each operation is raising
 | |
| a new warning (e.g. set warnings to be raised as exceptions and check the
 | |
| operations raise exceptions, check that the length of the warning list
 | |
| continues to increase after each operation, or else delete the previous
 | |
| entries from the warnings list before each new operation).
 | |
| 
 | |
| 
 | |
| .. _warning-ignored:
 | |
| 
 | |
| Updating Code For New Versions of Dependencies
 | |
| ----------------------------------------------
 | |
| 
 | |
| Warning categories that are primarily of interest to Python developers (rather
 | |
| than end users of applications written in Python) are ignored by default.
 | |
| 
 | |
| Notably, this "ignored by default" list includes :exc:`DeprecationWarning`
 | |
| (for every module except ``__main__``), which means developers should make sure
 | |
| to test their code with typically ignored warnings made visible in order to
 | |
| receive timely notifications of future breaking API changes (whether in the
 | |
| standard library or third party packages).
 | |
| 
 | |
| In the ideal case, the code will have a suitable test suite, and the test runner
 | |
| will take care of implicitly enabling all warnings when running tests
 | |
| (the test runner provided by the :mod:`unittest` module does this).
 | |
| 
 | |
| In less ideal cases, applications can be checked for use of deprecated
 | |
| interfaces by passing :option:`-Wd <-W>` to the Python interpreter (this is
 | |
| shorthand for :option:`!-W default`) or setting ``PYTHONWARNINGS=default`` in
 | |
| the environment. This enables default handling for all warnings, including those
 | |
| that are ignored by default. To change what action is taken for encountered
 | |
| warnings you can change what argument is passed to :option:`-W` (e.g.
 | |
| :option:`!-W error`). See the :option:`-W` flag for more details on what is
 | |
| possible.
 | |
| 
 | |
| 
 | |
| .. _warning-functions:
 | |
| 
 | |
| Available Functions
 | |
| -------------------
 | |
| 
 | |
| 
 | |
| .. function:: warn(message, category=None, stacklevel=1, source=None)
 | |
| 
 | |
|    Issue a warning, or maybe ignore it or raise an exception.  The *category*
 | |
|    argument, if given, must be a warning category class (see above); it defaults to
 | |
|    :exc:`UserWarning`.  Alternatively *message* can be a :exc:`Warning` instance,
 | |
|    in which case *category* will be ignored and ``message.__class__`` will be used.
 | |
|    In this case the message text will be ``str(message)``. This function raises an
 | |
|    exception if the particular warning issued is changed into an error by the
 | |
|    warnings filter see above.  The *stacklevel* argument can be used by wrapper
 | |
|    functions written in Python, like this::
 | |
| 
 | |
|       def deprecation(message):
 | |
|           warnings.warn(message, DeprecationWarning, stacklevel=2)
 | |
| 
 | |
|    This makes the warning refer to :func:`deprecation`'s caller, rather than to the
 | |
|    source of :func:`deprecation` itself (since the latter would defeat the purpose
 | |
|    of the warning message).
 | |
| 
 | |
|    *source*, if supplied, is the destroyed object which emitted a
 | |
|    :exc:`ResourceWarning`.
 | |
| 
 | |
|    .. versionchanged:: 3.6
 | |
|       Added *source* parameter.
 | |
| 
 | |
| 
 | |
| .. function:: warn_explicit(message, category, filename, lineno, module=None, registry=None, module_globals=None, source=None)
 | |
| 
 | |
|    This is a low-level interface to the functionality of :func:`warn`, passing in
 | |
|    explicitly the message, category, filename and line number, and optionally the
 | |
|    module name and the registry (which should be the ``__warningregistry__``
 | |
|    dictionary of the module).  The module name defaults to the filename with
 | |
|    ``.py`` stripped; if no registry is passed, the warning is never suppressed.
 | |
|    *message* must be a string and *category* a subclass of :exc:`Warning` or
 | |
|    *message* may be a :exc:`Warning` instance, in which case *category* will be
 | |
|    ignored.
 | |
| 
 | |
|    *module_globals*, if supplied, should be the global namespace in use by the code
 | |
|    for which the warning is issued.  (This argument is used to support displaying
 | |
|    source for modules found in zipfiles or other non-filesystem import
 | |
|    sources).
 | |
| 
 | |
|    *source*, if supplied, is the destroyed object which emitted a
 | |
|    :exc:`ResourceWarning`.
 | |
| 
 | |
|    .. versionchanged:: 3.6
 | |
|       Add the *source* parameter.
 | |
| 
 | |
| 
 | |
| .. function:: showwarning(message, category, filename, lineno, file=None, line=None)
 | |
| 
 | |
|    Write a warning to a file.  The default implementation calls
 | |
|    ``formatwarning(message, category, filename, lineno, line)`` and writes the
 | |
|    resulting string to *file*, which defaults to ``sys.stderr``.  You may replace
 | |
|    this function with any callable by assigning to ``warnings.showwarning``.
 | |
|    *line* is a line of source code to be included in the warning
 | |
|    message; if *line* is not supplied, :func:`showwarning` will
 | |
|    try to read the line specified by *filename* and *lineno*.
 | |
| 
 | |
| 
 | |
| .. function:: formatwarning(message, category, filename, lineno, line=None)
 | |
| 
 | |
|    Format a warning the standard way.  This returns a string which may contain
 | |
|    embedded newlines and ends in a newline.  *line* is a line of source code to
 | |
|    be included in the warning message; if *line* is not supplied,
 | |
|    :func:`formatwarning` will try to read the line specified by *filename* and
 | |
|    *lineno*.
 | |
| 
 | |
| 
 | |
| .. function:: filterwarnings(action, message='', category=Warning, module='', lineno=0, append=False)
 | |
| 
 | |
|    Insert an entry into the list of :ref:`warnings filter specifications
 | |
|    <warning-filter>`.  The entry is inserted at the front by default; if
 | |
|    *append* is true, it is inserted at the end.  This checks the types of the
 | |
|    arguments, compiles the *message* and *module* regular expressions, and
 | |
|    inserts them as a tuple in the list of warnings filters.  Entries closer to
 | |
|    the front of the list override entries later in the list, if both match a
 | |
|    particular warning.  Omitted arguments default to a value that matches
 | |
|    everything.
 | |
| 
 | |
| 
 | |
| .. function:: simplefilter(action, category=Warning, lineno=0, append=False)
 | |
| 
 | |
|    Insert a simple entry into the list of :ref:`warnings filter specifications
 | |
|    <warning-filter>`.  The meaning of the function parameters is as for
 | |
|    :func:`filterwarnings`, but regular expressions are not needed as the filter
 | |
|    inserted always matches any message in any module as long as the category and
 | |
|    line number match.
 | |
| 
 | |
| 
 | |
| .. function:: resetwarnings()
 | |
| 
 | |
|    Reset the warnings filter.  This discards the effect of all previous calls to
 | |
|    :func:`filterwarnings`, including that of the :option:`-W` command line options
 | |
|    and calls to :func:`simplefilter`.
 | |
| 
 | |
| 
 | |
| Available Context Managers
 | |
| --------------------------
 | |
| 
 | |
| .. class:: catch_warnings(\*, record=False, module=None)
 | |
| 
 | |
|     A context manager that copies and, upon exit, restores the warnings filter
 | |
|     and the :func:`showwarning` function.
 | |
|     If the *record* argument is :const:`False` (the default) the context manager
 | |
|     returns :class:`None` on entry. If *record* is :const:`True`, a list is
 | |
|     returned that is progressively populated with objects as seen by a custom
 | |
|     :func:`showwarning` function (which also suppresses output to ``sys.stdout``).
 | |
|     Each object in the list has attributes with the same names as the arguments to
 | |
|     :func:`showwarning`.
 | |
| 
 | |
|     The *module* argument takes a module that will be used instead of the
 | |
|     module returned when you import :mod:`warnings` whose filter will be
 | |
|     protected. This argument exists primarily for testing the :mod:`warnings`
 | |
|     module itself.
 | |
| 
 | |
|     .. note::
 | |
| 
 | |
|         The :class:`catch_warnings` manager works by replacing and
 | |
|         then later restoring the module's
 | |
|         :func:`showwarning` function and internal list of filter
 | |
|         specifications.  This means the context manager is modifying
 | |
|         global state and therefore is not thread-safe.
 |