Python warnings.warn () против logging.warning () - PullRequest
43 голосов
/ 07 марта 2012

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

Ответы [ 4 ]

49 голосов
/ 08 февраля 2013

Я согласен с другим ответом - logging для регистрации и warning для предупреждения - но я хотел бы добавить больше деталей.

Вот учебник HOWTO в стиле учебникавы через шаги в использовании logging модуля.http://docs.python.org/2/howto/logging.html

Он прямо отвечает на ваш вопрос:

warnings.warn () в коде библиотеки, если проблему можно избежать, а клиентское приложение следует изменить, чтобы исключить предупреждение

logging.warning (), если клиентское приложение ничего не может сделать с ситуацией, но событие все равно следует отметить

29 голосов
/ 23 июня 2016

logging.warning просто регистрирует что-то на уровне WARNING, точно так же, как logging.info регистрирует на уровне INFO и logging.error регистрирует на уровне ERROR. У него нет особого поведения.

warnings.warn испускает Warning, который может быть напечатан в stderr, полностью проигнорирован или выдан как обычный Exception (потенциально может привести к сбою приложения) в зависимости от точного выделенного подкласса Warning и от того, как вы настроили Warnings Filter . По умолчанию предупреждения выводятся на stderr или игнорируются.

Предупреждения, испускаемые warnings.warn, часто полезно знать, но их легко пропустить (особенно если вы запускаете программу Python в фоновом режиме и не захватывает stderr). По этой причине может быть полезно зарегистрировать их. Python предоставляет встроенную интеграцию между модулем logging и модулем warnings, чтобы позволить вам сделать это; просто позвоните logging.captureWarnings(True) в начале вашего скрипта, и все предупреждения, выданные модулем warnings, будут автоматически регистрироваться на уровне WARNING.

16 голосов
/ 18 ноября 2016

Кроме канонического объяснения в официальной документации

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")
>>>
11 голосов
/ 07 марта 2012

Один вызывает исключение, которое может быть перехвачено или проигнорировано, а другой при необходимости добавляет запись в журнал на основе текущего уровня ведения журнала.Один должен использоваться, когда один предупреждает о различных вещах в коде, а другой должен использоваться при регистрации.

...