\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
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,
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
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)):
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
pass
elif action == "module":
registry[key] = 1
- altkey = (message, category, 0)
+ altkey = (text, category, 0)
if registry.get(altkey):
return
registry[altkey] = 1