Распечатать только сообщение с предупреждениями - PullRequest
34 голосов
/ 02 февраля 2010

Я выдаю много предупреждений в валидаторе, и я хотел бы подавить все в stdout, кроме сообщения, которое подается на 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')

Ответы [ 4 ]

21 голосов
/ 02 февраля 2010

Обезьяны всегда есть:

import warnings

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

warnings.formatwarning = custom_formatwarning
warnings.warn("achtung")
15 голосов
/ 02 февраля 2010

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

10 голосов
/ 02 февраля 2010

Используйте модуль регистрации вместо warnings.

9 голосов
/ 08 октября 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...