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

Python warnings.warn() против logging.warning()

В чем разница между warnings.warn() и logging.warn() с точки зрения того, что они делают и как их следует использовать?

4b9b3361

Ответ 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")
>>>