From b25c2b0a4a46156bd8efa9eab39503e18fa0b805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Walter=20D=C3=B6rwald?= Date: Thu, 21 Mar 2002 10:38:40 +0000 Subject: [PATCH] [Apply SF patch #504943] This patch makes it possible to pass Warning instances as the first argument to warnings.warn. In this case the category argument will be ignored. The message text used will be str(warninginstance). --- Doc/lib/libwarnings.tex | 8 +++++++- Lib/warnings.py | 19 ++++++++++++++----- Misc/NEWS | 2 ++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Doc/lib/libwarnings.tex b/Doc/lib/libwarnings.tex index b7c7d63551b..573d99c163b 100644 --- a/Doc/lib/libwarnings.tex +++ b/Doc/lib/libwarnings.tex @@ -145,7 +145,10 @@ message to \code{sys.stderr}). \begin{funcdesc}{warn}{message\optional{, category\optional{, stacklevel}}} Issue a warning, or maybe ignore it or raise an exception. The \var{category} argument, if given, must be a warning category class -(see above); it defaults to \exception{UserWarning}. This function +(see above); it defaults to \exception{UserWarning}. Alternatively +\var{message} can be a \exception{Warning} instance, in which case +\var{category} will be ignore and \code{message.__class__} will be used. +In this case the message text will be \code{str(message)}. This function raises an exception if the particular warning issued is changed into an error by the warnings filter see above. The \var{stacklevel} argument can be used by wrapper functions written in Python, like @@ -169,6 +172,9 @@ filename and line number, and optionally the module name and the registry (which should be the \code{__warningregistry__} dictionary of the module). The module name defaults to the filename with \code{.py} stripped; if no registry is passed, the warning is never suppressed. +\var{message} must be a string and \var{category} a subclass of +\exception{Warning} or \var{message} may be a \exception{Warning} instance, +in which case \var{category} will be ignored. \end{funcdesc} \begin{funcdesc}{showwarning}{message, category, filename, diff --git a/Lib/warnings.py b/Lib/warnings.py index 5bb00c19758..7ae98209699 100644 --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -11,6 +11,9 @@ onceregistry = {} def warn(message, category=None, stacklevel=1): """Issue a warning, or maybe ignore it or raise an exception.""" + # Check if message is already a Warning object + if isinstance(message, Warning): + category = message.__class__ # Check category argument if category is None: category = UserWarning @@ -49,14 +52,20 @@ def warn_explicit(message, category, filename, lineno, module = module[:-3] # XXX What about leading pathname? if registry is None: registry = {} - key = (message, category, lineno) + if isinstance(message, Warning): + text = str(message) + category = message.__class__ + else: + text = message + message = category(message) + key = (text, category, lineno) # Quick test for common case if registry.get(key): return # Search the filters for item in filters: action, msg, cat, mod, ln = item - if (msg.match(message) and + if (msg.match(text) and issubclass(category, cat) and mod.match(module) and (ln == 0 or lineno == ln)): @@ -68,11 +77,11 @@ def warn_explicit(message, category, filename, lineno, registry[key] = 1 return if action == "error": - raise category(message) + raise message # Other actions if action == "once": registry[key] = 1 - oncekey = (message, category) + oncekey = (text, category) if onceregistry.get(oncekey): return onceregistry[oncekey] = 1 @@ -80,7 +89,7 @@ def warn_explicit(message, category, filename, lineno, pass elif action == "module": registry[key] = 1 - altkey = (message, category, 0) + altkey = (text, category, 0) if registry.get(altkey): return registry[altkey] = 1 diff --git a/Misc/NEWS b/Misc/NEWS index ada779e807c..4373f1af428 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -70,6 +70,8 @@ Library - distutils bdist commands now offer a --skip-build option. +- warnings.warn now accepts a Warning instance as first argument. + Tools/Demos Build