仅打印警告消息

问题描述 投票:0回答:5

我在验证器中发出大量警告,并且我想抑制标准输出中的所有内容,除了提供给

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')
python warnings
5个回答
47
投票

总是有猴子补丁:

import warnings

def custom_formatwarning(msg, *args, **kwargs):
    # ignore everything except the message
    return str(msg) + '\n'

warnings.formatwarning = custom_formatwarning
warnings.warn("achtung")

21
投票

Monkeypatch

warnings.showwarning()
具有您自己的自定义功能。


13
投票

使用记录模块而不是

warnings


11
投票

这就是我正在做的事情,以省略只是源代码行。这基本上是文档所建议的,但要弄清楚到底要改变什么有点困难。 (特别是,我尝试以各种方式将源代码行排除在

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
的值,但传递空字符串可以解决此问题。


0
投票

您已声明您不喜欢默认消息:

./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
© www.soinside.com 2019 - 2024. All rights reserved.