Подтвердить что ты не робот

Python: печать только сообщений о предупреждениях

Я выдаю много предупреждений в валидаторе, и я хотел бы подавить все в stdout, кроме сообщения, которое предоставляется warnings.warn().

I.e., теперь я вижу это:

./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')
4b9b3361

Ответ 1

Monkeypatch warnings.showwarning() с вашей собственной пользовательской функцией.

Ответ 2

Всегда есть monkeypatching:

import warnings

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

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

Ответ 4

Вот что я делаю, чтобы опустить только строку исходного кода. Это по большому счету, как было предложено в документации, но было немного сложно выяснить, что именно изменится. (В частности, я попытался разными способами сохранить исходную строку из 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, но вместо этого исправляет пустую строку.