Фильтр предупреждений определяет, будут ли предупреждения игнорироваться, отображаться или превращаться в ошибки, вызывая исключение.
Концептуально фильтр предупреждений поддерживает упорядоченный список спецификаций фильтра. Любое конкретное предупреждение сопоставляется с каждой спецификацией фильтра в списке по очереди, пока не будет найдено совпадение. Фильтр определяет расположение совпадения. Каждая запись представляет собой кортеж формы (action, message, category, module, lineno), где:
action - это одна из следующих строк:| Значение | Правило поведения |
'default' | Вывести первое вхождение соответствующих предупреждений для каждого местоположения (модуль + номер строки), где выдается предупреждение |
'error' | Превратить соответствующие предупреждения в исключения |
'ignore' | Никогда не печатать соответствующие предупреждения |
'always' | Всегда печатать соответствующие предупреждения |
'module' | Вывести первое вхождение соответствующих предупреждений для каждого модуля, в котором выдается предупреждение (независимо от номера строки) |
'once' | Печатать только первое появление совпадающих предупреждений, независимо от местоположения |
Поскольку класс Warning является производным от встроенного класса Exception, чтобы превратить предупреждение в ошибку, мы просто поднимаем raise category(message).
Если предупреждение появляется и не соответствует ни одному зарегистрированному фильтру, применяется действие по умолчанию, отсюда и его имя.
Фильтр предупреждений инициализируется параметрами -W, передаваемыми в командную строку интерпретатора Python и в переменную среды PYTHONWARNINGS. Интерпретатор сохраняет аргументы для всех предоставленных записей без интерпретации в sys.warnoptions. Модуль warnings анализирует их при первом импорте, недопустимые параметры игнорируются после печати сообщения в sys.stderr.
Фильтры отдельных предупреждений указываются в виде последовательности полей, разделенных двоеточиями:
action:message:category:module:line
Значение каждого из этих полей описано выше. При перечислении нескольких фильтров в одной строке, отдельные фильтры разделяются запятыми, а фильтры перечисленные позже, имеют приоритет над теми, которые перечислены до них.
Обычно используемые фильтры предупреждений применяются ко всем предупреждениям, предупреждениям в определенной категории или предупреждениям, выданным определенными модулями или пакетами. Некоторые примеры:
# Показать все предупреждения # даже те, которые игнорируются по умолчанию default # Игнорировать все предупреждения ignore # Конвертировать все предупреждения в ошибки error # Обрабатывать сообщения ResourceWarning как ошибки error::ResourceWarning # Показать сообщения DeprecationWarning default::DeprecationWarning # Сообщать только о предупреждениях, # вызванных 'mymodule' ignore,default:::mymodule # Преобразование предупреждений об ошибках # в 'mymodule' и любых подпакетах 'mymodule' error:::mymodule[.*]