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