Фильтр предупреждений определяет, будут ли предупреждения игнорироваться, отображаться или превращаться в ошибки, вызывая исключение.
Концептуально фильтр предупреждений поддерживает упорядоченный список спецификаций фильтра. Любое конкретное предупреждение сопоставляется с каждой спецификацией фильтра в списке по очереди, пока не будет найдено совпадение. Фильтр определяет расположение совпадения. Каждая запись представляет собой кортеж формы (action, message, category, module, lineno)
, где:
action
- это одна из следующих строк:Значение | Правило поведения |
'default' | Вывести первое вхождение соответствующих предупреждений для каждого местоположения (модуль + номер строки), где выдается предупреждение |
'error' | Превратить соответствующие предупреждения в исключения |
'ignore' | Никогда не печатать соответствующие предупреждения |
'always' | Всегда печатать соответствующие предупреждения |
'module' | Вывести первое вхождение соответствующих предупреждений для каждого модуля, в котором выдается предупреждение (независимо от номера строки) |
'once' | Печатать только первое появление совпадающих предупреждений, независимо от местоположения |
message
- это строка, содержащая регулярное выражение, которому должно соответствовать начало предупреждающего сообщения. Выражение составляется без учета регистра.category
- это категория из таблицы категорий предупреждений.module
- это строка, содержащая регулярное выражение, которому должно соответствовать имя модуля. Выражение составляется с учетом регистра.lineno
- это целое число, которое должно совпадать с номером строки, где произошло предупреждение или 0, чтобы соответствовать всем номерам строк.Поскольку класс 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[.*]