Ответ 1
Monkeypatch warnings.showwarning()
с вашей собственной пользовательской функцией.
Я выдаю много предупреждений в валидаторе, и я хотел бы подавить все в 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')
Monkeypatch warnings.showwarning()
с вашей собственной пользовательской функцией.
Всегда есть monkeypatching:
import warnings
def custom_formatwarning(msg, *a):
# ignore everything except the message
return str(msg) + '\n'
warnings.formatwarning = custom_formatwarning
warnings.warn("achtung")
Используйте модуль протоколирования вместо warnings
.
Вот что я делаю, чтобы опустить только строку исходного кода. Это по большому счету, как было предложено в документации, но было немного сложно выяснить, что именно изменится. (В частности, я попытался разными способами сохранить исходную строку из 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
, но вместо этого исправляет пустую строку.