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

arn*_*ney 6 python warnings python-3.x

我的最小例子是

#!/usr/bin/python3

import warnings

warnings.warn('Run Forest run!', stacklevel=2)
warnings.warn('Run Forest run!')
Run Code Online (Sandbox Code Playgroud)

它会输出

sys:1: UserWarning: Run Forest run!
./file.py:6: UserWarning: Run Forest run!
  warnings.warn('Run Forest run!')
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*x W 6

您得到“冗余”行的原因是因为如果您不提供参数,则stacklevel默认stacklevel值为 1,这基本上是告诉用户警告源自的确切代码行,即您的警告函数调用warnings.warn('Run Forest Run!')

如果您对其功能不满意,可以使用该warnings.warn_explicit()功能对其进行自定义。

https://docs.python.org/3.1/library/warnings.html#available-functions


arn*_*ney 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!')
Run Code Online (Sandbox Code Playgroud)

输出:

sys:1: UserWarning: Run Forest run!
./file.py:15: UserWarning: Run Forest run!
Run Code Online (Sandbox Code Playgroud)

资料来源: 本周的Python模块