Warnings

Предупреждающие сообщения обычно выдаются в ситуациях, когда полезно предупредить пользователя о каком-либо состоянии в программе, где это условие (обычно) не требует возбуждения исключения и завершения программы. Модуль warnings является средством, позволяющим заблаговременно оповещать программистов об изменениях в языке и проблемах обратной совместимости. Кроме того он может использоваться для вывода сообщений о восстановимых ошибках конфигурации или изменения возможностей из-за отсутствия каких-то библиотек.

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

Управление предупреждениями состоит из двух этапов: во-первых, каждый раз, когда выдается предупреждение, определяется, следует ли выдавать сообщение или нет; затем, если сообщение должно быть выдано, оно форматируется и печатается с использованием настраиваемого пользователем хука. Решение о том, выдавать ли предупреждающее сообщение, контролируется фильтром предупреждений, который представляет собой последовательность соответствующих правил и действий. Правила можно добавить к фильтру, вызвав filterwarnings(), и сбросить его до состояния по умолчанию, вызвав resetwarnings(). Печать предупреждающих сообщений выполняется вызовом функции showwarning(), которую можно переопределить; реализация этой функции по умолчанию форматирует сообщение, вызывая formatwarning(), который также доступен для использования пользовательскими реализациями. logging.captureWarnings() позволяет обрабатывать все предупреждения с помощью стандартной инфраструктуры [python-logging].

Существует ряд встроенных исключений, представляющих категории предупреждений. Эта категоризация полезна для возможности фильтрации групп предупреждений. Пользовательский код может определять дополнительные категории предупреждений путем подкласса одной из стандартных категорий предупреждений. Категория предупреждения всегда должна быть подклассом класса предупреждения. В настоящее время определены следующие классы категорий предупреждений:

  • Warning базовый класс предупреждений, сабкласс Exception
  • UserWarning дефолтная категория для warn()
  • DeprecationWarning базовая категория для разработчиков приложений
  • SyntaxWarning
  • RuntimeWarning
  • FutureWarning базовая категория для конечных пользователей приложений
  • PendingDeprecationWarning предупреждение о возможном исключении в будущем
  • ImportWarning
  • UnicodeWarning
  • BytesWarning
  • ResourceWarning

Подробнее тут

Фильтр предупреждений определяет, будут ли предупреждения игнорироваться, выводиться или создавать исключения. Филтр представляет собой кортеж вида (action, message, category, module, lineno), где:

  • message - регулярное выражение для сопоставления с текстом предупреждения
  • category - имя класса исключений
  • module - регулярное выражение, сопоставимое с именем модуля, сгенерировашего предупреждение
  • line number - обрабатывает специфические вхождения

Сгенерированное предупреждение сравнивается со всеми зарегистрирвоанными фильтрами. Первый совпавший фильтр регулирует действия в ответ на предупреждение. Если не один из фильтров не совпал, выполняется действие по умолчанию.

Возможные действия:

  • error поднять исключение
  • ignore игнорировать
  • always всегда выводить
  • default выводить, если предупреждение поднято впервые в данном контексте
  • module выводить, если предупреждение поднято впервые в данном модуле
  • once однократно

Подробнее тут

Простейший способ вызова:

import warnings

warnings.warn('This is a warning message')

Вот так можно задать простейший фильтр (в данном случае поднять исклоючение):

import warnings

warnings.simplefilter('error', UserWarning)
warnings.warn('This is a warning message')

Смотри также: