В чем разница между warnings.warn()
и logging.warn()
с точки зрения того, что они делают и как их следует использовать?
Python warnings.warn() против logging.warning()
Ответ 1
Один вызывает исключение, которое может быть уловлено или проигнорировано по желанию, а другое необязательно добавляет запись в журнал на основе текущего уровня ведения журнала. Один должен использоваться, когда вы предупреждаете о различных вещах в коде, а другой должен использоваться при регистрации.
Ответ 2
Я согласен с другим ответом - logging
для регистрации, а warning
для предупреждения - но я хотел бы добавить больше деталей.
Вот HOWTO в виде учебника, в котором рассказывается, как использовать модуль logging
.
https://docs.python.org/3/howto/logging.html
Это прямо отвечает на ваш вопрос:
warnings.warn() в коде библиотеки, если проблему можно избежать и клиентское приложение должно быть изменено, чтобы исключить предупреждение
logging.warning(), если клиентское приложение ничего не может сделать о ситуации, но событие все же следует отметить
Ответ 3
logging.warning
просто регистрирует что-то на уровне WARNING
, так же, как logging.info
регистрирует на уровне INFO
и logging.error
регистрирует на уровне ERROR
. У него нет особого поведения.
warnings.warn
испускает Warning
, который может быть напечатан на stderr
, полностью проигнорирован или брошен как обычный Exception
(потенциально может привести к сбою приложения) в зависимости от точного Warning
исполнил подкласс и как вы настроили свой фильтр предупреждений. По умолчанию предупреждения будут напечатаны в stderr
или проигнорированы.
Предупреждения, испускаемые warnings.warn
, часто полезно знать, но их легко пропустить (особенно если вы запускаете программу Python в фоновом режиме, а не захватываете stderr
). По этой причине может быть полезно зарегистрировать их. Python предоставляет встроенную интеграцию между модулем logging
и модулем warnings
, чтобы позволить вам сделать это; просто вызовите logging.captureWarnings(True)
в начале вашего скрипта, и все предупреждения, выданные модулем warnings
, будут автоматически зарегистрированы на уровне WARNING
.
Ответ 4
Помимо канонического объяснения в официальной документации
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")
>>>