Print only the message on warnings

2019-01-14 15:03发布

I'm issuing lots of warnings in a validator, and I'd like to suppress everything in stdout except the message that is supplied to warnings.warn().

I.e., now I see this:

./file.py:123: UserWarning: My looong warning message
some Python code

I'd like to see this:

My looong warning message

Edit 2: Overriding warnings.showwarning() turned out to work:

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

4条回答
Luminary・发光体
2楼-- · 2019-01-14 15:34

Use the logging module instead of warnings.

查看更多
相关推荐>>
3楼-- · 2019-01-14 15:35

There is always 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")
查看更多
该账号已被封号
4楼-- · 2019-01-14 15:50

Monkeypatch warnings.showwarning() with your own custom function.

查看更多
可以哭但决不认输i
5楼-- · 2019-01-14 15:57

Here's what I'm doing to omit just the source code line. This is by and large as suggested by the documentation, but it was a bit of a struggle to figure out what exactly to change. (In particular, I tried in various ways to keep the source line out of showwarnings but couldn't get it to work the way I wanted.)

# 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='')

Just passing line=None would cause Python to use filename and lineno to figure out a value for line automagically, but passing an empty string instead fixes that.

查看更多
登录 后发表回答