我的最小例子是
#!/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!')
第一行给了我一些信息。第二行是完美的,给我源文件和行号...但我想摆脱多余的第三行。这可能吗?
答案 0 :(得分:5)
事实证明,可以让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!
答案 1 :(得分:4)
你得到"多余" line是因为如果你不提供stacklevel
参数,则默认stacklevel
为1,这基本上是告诉用户警告来自的确切代码行,这是你的警告功能致电warnings.warn('Run Forest Run!')
。
如果您对其运作方式不满意,可以使用warnings.warn_explicit()
功能进行自定义。
https://docs.python.org/3.1/library/warnings.html#available-functions
答案 2 :(得分:2)
如果您尝试捕获异常/错误,并希望同时看到自定义警告消息和回溯,您可能更喜欢使用traceback.print_exc():
import traceback
import warnings
def _formatwarning(msg, *a):
try:
traceback.print_exc()
except:
pass
return str(msg)
warnings.formatwarning = _formatwarning
这将使警告(“你的消息”)打印回溯,而不提及对warn()本身的调用。
Python 3.6上的更新:您需要将函数签名更改为:
def _formatwarning(message, category, filename, lineno, line='')