diff options
-rw-r--r-- | Doc/lib/libwarnings.tex | 8 | ||||
-rw-r--r-- | Lib/warnings.py | 19 | ||||
-rw-r--r-- | Misc/NEWS | 2 |
3 files changed, 23 insertions, 6 deletions
diff --git a/Doc/lib/libwarnings.tex b/Doc/lib/libwarnings.tex index b7c7d63..573d99c 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 5bb00c1..7ae9820 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 @@ -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 |