我的最小例子是
#!/usr/bin/python3
import warnings
warnings.warn('Run Forest run!', stacklevel=2)
warnings.warn('Run Forest run!')它将输出
sys:1: UserWarning: Run Forest run!
./file.py:6: UserWarning: Run Forest run!
warnings.warn('Run Forest run!')第一行给我提供了一些小信息。第二行很完美,给我源文件和行号.但我想去掉多余的第三行。这有可能吗?
发布于 2014-10-17 21:50:08
事实证明,让warnings.warn()收集所有信息并对信息的打印方式进行定制是可能的:
#!/usr/bin/python3
import warnings
def warning_on_one_line(message, category, filename, lineno, file=None, line=None):
return '%s:%s: %s: %s\n' % (filename, lineno, category.__name__, message)
warnings.formatwarning = warning_on_one_line
warnings.warn('Run Forest run!', stacklevel=2)
warnings.warn('Run Forest run!')输出:
sys:1: UserWarning: Run Forest run!
./file.py:15: UserWarning: Run Forest run!资料来源: 每周Python模块
发布于 2014-10-17 18:25:15
获得“冗余”行的原因是,如果不提供stacklevel参数,默认的stacklevel是1,这基本上是告诉用户发出警告的确切代码行,即您的警告函数调用warnings.warn('Run Forest Run!')。
如果您对它的工作方式不满意,可以使用warnings.warn_explicit()函数来自定义它。
https://docs.python.org/3.1/library/warnings.html#available-functions
发布于 2016-01-19 20:49:06
如果您试图捕获异常/错误,并且希望同时看到您的自定义警告消息和跟踪,您可能更喜欢使用traceback.print_exc():
import traceback
import warnings
def _formatwarning(msg, *a):
try:
traceback.print_exc()
except:
pass
return str(msg)
warnings.formatwarning = _formatwarning这将使warn(“您的消息”)打印回溯,而没有提到对warn()本身的调用。
更新:Python3.6上的需要将函数签名更改为:
def _formatwarning(message, category, filename, lineno, line='')https://stackoverflow.com/questions/26430861
复制相似问题