如果我想找到一个警告的根源,通常会将 Warnings
提升为 Exceptions
。
在你的情况下,你可以简单地使用 warnings.simplefilter
或者 warnings.filterwarnings
。
例如:
import warnings
def func():
warnings.warn('abc', UserWarning)
def func2():
func()
warnings.simplefilter("error", UserWarning)
func2()
这将会给出完整的回溯信息:
---------------------------------------------------------------------------
UserWarning Traceback (most recent call last)
<ipython-input-11-be791e1071e7> in <module>()
8
9 warnings.simplefilter("error", UserWarning)
---> 10 func2()
<ipython-input-11-be791e1071e7> in func2()
5
6 def func2():
----> 7 func()
8
9 warnings.simplefilter("error", UserWarning)
<ipython-input-11-be791e1071e7> in func()
2
3 def func():
----> 4 warnings.warn('abc', UserWarning)
5
6 def func2():
UserWarning: abc
如果您想调试这个问题,您可以轻松地挂接Python的pdb
在最后遇到的异常上:
import pdb
pdb.pm()
导致:
> <ipython-input-11-be791e1071e7>(4)func()
-> warnings.warn('abc', UserWarning)
(Pdb) _________________
这将启动对最近遇到的异常的事后分析。这将使您能够浏览帧并检查变量等。
您还询问了一个标志,确实有一个标志可以启用“警告处理”,即
-W
标志。它非常类似于
warnings.filterwarnings
函数。为方便起见,我在此处复制了
-W
标志的文档:
Warning control. Python’s warning machinery by default prints warning messages to sys.stderr. A typical warning message has the following form:
file:line: category: message
By default, each warning is printed once for each source line where it occurs. This option controls how often warnings are printed.
Multiple -W options may be given; when a warning matches more than one option, the action for the last matching option is performed. Invalid -W options are ignored (though, a warning message is printed about invalid options when the first warning is issued).
Starting from Python 2.7, DeprecationWarning and its descendants are ignored by default. The -Wd option can be used to re-enable them.
Warnings can also be controlled from within a Python program using the warnings module.
The simplest form of argument is one of the following action strings (or a unique abbreviation) by themselves:
ignore
Ignore all warnings.
default
Explicitly request the default behavior (printing each warning once per source line).
all
Print a warning each time it occurs (this may generate many messages if a warning is triggered repeatedly for the same source line, such as inside a loop).
module
Print each warning only the first time it occurs in each module.
once
Print each warning only the first time it occurs in the program.
error:
Raise an exception instead of printing a warning message.
The full form of argument is:
action:message:category:module:line
Here, action is as explained above but only applies to messages that match the remaining fields. Empty fields match all values; trailing empty fields may be omitted. The message field matches the start of the warning message printed; this match is case-insensitive. The category field matches the warning category. This must be a class name; the match tests whether the actual warning category of the message is a subclass of the specified warning category. The full class name must be given. The module field matches the (fully-qualified) module name; this match is case-sensitive. The line field matches the line number, where zero matches all line numbers and is thus equivalent to an omitted line number.