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


Відповіді:


-5

Один викликає виняток, який можна схопити або проігнорувати за бажанням, а інший за бажанням додає запис до журналу на основі поточного рівня реєстрації. Один слід використовувати, коли один попереджає про різні речі в коді, а інший - під час реєстрації.


23
Наскільки я розумію, прийнята відповідь є неправильною. Ні попередження, ні реєстрація не створюють винятку. Але друкуйте повідомлення. Однак у них є інша систематична система (однак можливо інтегрувати попередження в реєстрацію через logging.captureWarnings()). Попереджувальні повідомлення за замовчуванням відображаються лише один раз, як @cxrodgers пояснив, щоб сказати користувачеві змінити свій код. Увійшовши до іншого та задокументувавши всі попередження, можна, однак, налаштувати, що показувати в деталях. Попередження можна підняти до винятків, використовуючи `-W error '.
DerWeh

На жаль, ця відповідь не дуже корисна. "один піднімає ..." і "треба ..."? Що є що? warningsчи logging?
Пітер Ліллевольд,

86

Я погоджуюсь з іншою відповіддю - loggingдля реєстрації та warningдля попередження - але я хотів би додати більше деталей.

Ось навчальний посібник HOWTO, який проведе вас через кроки використання loggingмодуля. https://docs.python.org/3/howto/logging.html

Це безпосередньо відповідає на ваше запитання:

warnings.warn () у коді бібліотеки, якщо проблему можна уникнути, а клієнтську програму слід змінити, щоб усунути попередження

logging.warning (), якщо клієнтська програма нічого не може вдіяти щодо ситуації, але подію все-таки слід зазначити


60

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.


27

Окрім канонічного пояснення в офіційній документації

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")
>>>

1
Зверніть увагу, що "показувати лише один раз" - це передбачувана поведінка за замовчуванням, але фільтри попередження можуть це змінити.
Герріт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.