仅打印警告消息

l0b*_*0b0 34 python warnings

我在验证器中发出了很多警告,我想抑制stdout中的所有内容,除了提供的消息warnings.warn().

即,现在我看到了这个:

./file.py:123: UserWarning: My looong warning message
some Python code
Run Code Online (Sandbox Code Playgroud)

我想看到这个:

My looong warning message
Run Code Online (Sandbox Code Playgroud)

编辑2:覆盖warnings.showwarning()结果工作:

def _warning(
    message,
    category = UserWarning,
    filename = '',
    lineno = -1):
    print(message)
...
warnings.showwarning = _warning
warnings.warn('foo')
Run Code Online (Sandbox Code Playgroud)

Ott*_*ger 23

总是有monkeypatching:

import warnings

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

warnings.formatwarning = custom_formatwarning
warnings.warn("achtung")
Run Code Online (Sandbox Code Playgroud)

  • 我知道这个线程很旧,但是,您也可以使用lambda代替函数:warnings.formatwarning = lambda msg,* args,** kwargs:f'{msg} \ n'` (2认同)

Ign*_*ams 16

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

  • 你看过这个链接了吗?我引述:"您可以通过分配warnings.showwarning来替换此功能与替代实现." 手册*本身*建议您对模块进行monkeypatch. (7认同)

Geo*_*edy 10

使用日志记录模块而不是warnings.

  • 这就是我最初尝试使用“警告”的绝大多数情况下所得到的结果。如果您正在努力解决“警告”问题,您应该考虑此选项。严重地。 (2认同)

tri*_*eee 9

下面是我在做什么,省略的源代码行.这一点基本上都是文档所建议的,但要弄清楚究竟要改变什么是有点困难的.(特别是,我尝试了各种方法来保持源代码行,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='')
Run Code Online (Sandbox Code Playgroud)

只是传递line=None会导致Python使用filename并自动计算lineno出一个值line,但是传递一个空字符串会修复它.