summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Dörwald <walter@livinglogic.de>2002-03-21 10:38:40 (GMT)
committerWalter Dörwald <walter@livinglogic.de>2002-03-21 10:38:40 (GMT)
commitb25c2b0a4a46156bd8efa9eab39503e18fa0b805 (patch)
tree8a48a9537b24e37ab60c2f69404a848451251234
parent047c05ebc4ce00f9ca8ccc5b8df437d758d130e8 (diff)
downloadcpython-b25c2b0a4a46156bd8efa9eab39503e18fa0b805.zip
cpython-b25c2b0a4a46156bd8efa9eab39503e18fa0b805.tar.gz
cpython-b25c2b0a4a46156bd8efa9eab39503e18fa0b805.tar.bz2
[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).
-rw-r--r--Doc/lib/libwarnings.tex8
-rw-r--r--Lib/warnings.py19
-rw-r--r--Misc/NEWS2
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
diff --git a/Misc/NEWS b/Misc/NEWS
index ada779e..4373f1a 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