我在验证器中发出大量警告,并且我想抑制标准输出中的所有内容,除了提供给
warnings.warn()
的消息。
即,现在我看到了:
./file.py:123: UserWarning: My looong warning message
some Python code
我想看这个:
My looong warning message
编辑2:覆盖
warnings.showwarning()
结果有效:
def _warning(
message,
category = UserWarning,
filename = '',
lineno = -1):
print(message)
...
warnings.showwarning = _warning
warnings.warn('foo')
总是有猴子补丁:
import warnings
def custom_formatwarning(msg, *args, **kwargs):
# ignore everything except the message
return str(msg) + '\n'
warnings.formatwarning = custom_formatwarning
warnings.warn("achtung")
warnings.showwarning()
具有您自己的自定义功能。
使用记录模块而不是
warnings
。
这就是我正在做的事情,以省略只是源代码行。这基本上是文档所建议的,但要弄清楚到底要改变什么有点困难。 (特别是,我尝试以各种方式将源代码行排除在
showwarnings
之外,但无法让它按照我想要的方式工作。)
# Force warnings.warn() to omit the source code line in the message
formatwarning_orig = warnings.formatwarning
warnings.formatwarning = lambda message, category, filename, lineno, line=None: \
formatwarning_orig(message, category, filename, lineno, line='')
仅传递
line=None
会导致 Python 使用 filename
和 lineno
自动计算 line
的值,但传递空字符串可以解决此问题。
您已声明您不喜欢默认消息:
./file.py:123: UserWarning: My looong warning message
some Python code
你说你只想看:
My looong warning message
但我愿意猜测这里的核心问题是文件路径和显示的源代码。通过传递附加参数可以更简单地删除这些:
warnings.warn(msg, stacklevel=3)
这将产生一条如下所示的消息:
sys:1: UserWarning:
Your long message