В чем разница между warnings.warn()
и logging.warn()
с точки зрения того, что они делают и как они должны быть использованы?
В чем разница между warnings.warn()
и logging.warn()
с точки зрения того, что они делают и как они должны быть использованы?
Ответы:
Один вызывает исключение, которое может быть перехвачено или проигнорировано по желанию, а другой, при необходимости, добавляет запись в журнал на основе текущего уровня ведения журнала. Один должен использоваться, когда один предупреждает о различных вещах в коде, а другой должен использоваться при регистрации.
logging.captureWarnings()
). Предупреждающие сообщения по умолчанию отображаются только один раз, как объяснил @cxrodgers, чтобы указать пользователю изменить свой код. Однако, ведя журнал на другом и документируя все предупреждения, можно настроить отображение подробностей. Предупреждения об исключениях могут выводиться с помощью параметра -W error.
warnings
или logging
?
Я согласен с другим ответом - logging
для регистрации иwarning
для предупреждения, но я хотел бы добавить более подробную информацию.
Вот HOWTO в стиле учебника, в котором вы узнаете, как использовать logging
модуль.
https://docs.python.org/3/howto/logging.html
Он прямо отвечает на ваш вопрос:
warnings.warn () в коде библиотеки, если проблему можно избежать и клиентское приложение следует изменить, чтобы исключить предупреждение
logging.warning (), если клиентское приложение ничего не может сделать с ситуацией, но событие все же следует отметить.
logging.warning
просто регистрирует что-то на WARNING
уровне, точно так же, как logging.info
ведет журнал на INFO
уровне и logging.error
ведет журнал на ERROR
уровне. Особого поведения не имеет.
warnings.warn
испускает a Warning
, который может быть напечатан stderr
, полностью проигнорирован или брошен как обычно Exception
(что может привести к сбою вашего приложения) в зависимости от точного Warning
созданного подкласса и того, как вы настроили свой фильтр предупреждений . По умолчанию предупреждения выводятся stderr
или игнорируются.
Предупреждения, выдаваемые службой warnings.warn
, часто полезно знать, но их легко пропустить (особенно если вы запускаете программу Python в фоновом режиме, а не в захват stderr
). По этой причине может быть полезно зарегистрировать их.
Python предоставляет встроенную интеграцию между logging
модулем и warnings
модулем, чтобы вы могли это сделать; просто вызовите logging.captureWarnings(True)
в начале своего скрипта, и все предупреждения, выдаваемые warnings
модулем, будут автоматически регистрироваться на уровне WARNING
.
Помимо канонического объяснения в официальной документации
warnings.warn () в коде библиотеки, если проблему можно избежать и клиентское приложение следует изменить, чтобы исключить предупреждение
logging.warning (), если клиентское приложение ничего не может сделать с ситуацией, но событие все же следует отметить.
Также стоит отметить, что по умолчанию warnings.warn("same message")
будет отображаться только один раз. Это очень заметная разница. Цитата из официального документа
Повторения конкретного предупреждения для одного и того же источника обычно подавляются.
>>> import warnings
>>> warnings.warn("foo")
__main__:1: UserWarning: foo
>>> warnings.warn("foo")
>>> warnings.warn("foo")
>>>
>>> import logging
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>>
>>>
>>> warnings.warn("fur")
__main__:1: UserWarning: fur
>>> warnings.warn("fur")
>>> warnings.warn("fur")
>>>