让Python的`warnings.warn()`不提自己

时间:2014-10-17 18:02:28

标签: python python-3.x warnings

我的最小例子是

#!/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!')

第一行给了我一些信息。第二行是完美的,给我源文件和行号...但我想摆脱多余的第三行。这可能吗?

3 个答案:

答案 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!

来源: Python module of the week

答案 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='')