У чому різниця між warnings.warn()
і logging.warn()
з точки зору того, що вони роблять і як вони повинні бути використані?
У чому різниця між warnings.warn()
і logging.warn()
з точки зору того, що вони роблять і як вони повинні бути використані?
Відповіді:
Один викликає виняток, який можна схопити або проігнорувати за бажанням, а інший за бажанням додає запис до журналу на основі поточного рівня реєстрації. Один слід використовувати, коли один попереджає про різні речі в коді, а інший - під час реєстрації.
logging.captureWarnings()
). Попереджувальні повідомлення за замовчуванням відображаються лише один раз, як @cxrodgers пояснив, щоб сказати користувачеві змінити свій код. Увійшовши до іншого та задокументувавши всі попередження, можна, однак, налаштувати, що показувати в деталях. Попередження можна підняти до винятків, використовуючи `-W error '.
warnings
чи logging
?
Я погоджуюсь з іншою відповіддю - logging
для реєстрації та warning
для попередження - але я хотів би додати більше деталей.
Ось навчальний посібник HOWTO, який проведе вас через кроки використання logging
модуля.
https://docs.python.org/3/howto/logging.html
Це безпосередньо відповідає на ваше запитання:
warnings.warn () у коді бібліотеки, якщо проблему можна уникнути, а клієнтську програму слід змінити, щоб усунути попередження
logging.warning (), якщо клієнтська програма нічого не може вдіяти щодо ситуації, але подію все-таки слід зазначити
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
.
Окрім канонічного пояснення в офіційній документації
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")
>>>