Сообщить об ошибке.

Класс catch_warnings() модуля warnings в Python

Менеджер подавления предупреждений warning

Синтаксис:

import warnings

warnings.catch_warnings(*, record=False, module=None, action=None, 
                        category=Warning, lineno=0, append=False)

Параметры:

  • record=False - управляет возвращаемым значением,
  • module=None - тестирования самого модуля warnings,
  • action=None - если True, то разрешает передачу аргументов из warnings.simplefilter() (добавлен в Python 3.11),
  • category=Warning - смотри описание warnings.simplefilter() (добавлен в Python 3.11),
  • lineno=0 - смотри описание warnings.simplefilter() (добавлен в Python 3.11),
  • append=False - смотри описание warnings.simplefilter() (добавлен в Python 3.11).

Возвращаемое значение:

Описание:

Класс catch_warnings() модуля warnings представляет собой менеджер контекста, который копирует и при выходе восстанавливает фильтр предупреждений и функцию warnings.showwarning().

Если аргумент record=False (по умолчанию), менеджер контекста возвращает None при входе. Если для record задано значение True, то возвращается список, который постепенно заполняется объектами, видимыми пользовательской функцией warnings.showwarning()]warnings.showwarning, которая также подавляет вывод в sys.stdout. Каждый объект в списке имеет атрибуты с теми же именами, что и аргументы функции warnings.showwarning().

Аргумент module принимает модуль, который будет использоваться вместо модуля, возвращаемого при импорте warnings, чей фильтр будет защищен. Этот аргумент существует главным образом для тестирования самого модуля warnings.

Если аргумент action не равен None, то остальные аргументы передаются warnings.simplefilter(), как если бы он был вызван сразу при входе в контекст.

Примечание. Менеджер контекста warnings.catch_warnings() работает путем замены, а затем восстановления функции warnings.showwarning() модуля и внутреннего списка спецификаций фильтров. Это означает, что менеджер контекста изменяет глобальное состояние и поэтому не является потокобезопасным.

Изменено в версии 3.11: добавлены параметры action, category, lineno и append, которые предоставляют более лаконичный способ локального игнорирования предупреждений или преобразования их в ошибки.

Примеры использования warnings.catch_warnings().

Можно временно отключить предупреждения с помощью контекстного менеджера warnings.catch_warnings()

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings():
    warnings.simplefilter("ignore")
    fxn()

Или делаем так, что все предупреждения по умолчанию были отключены ignore, а при тестировании делаем так:

import warnings

def fxn():
    warnings.warn("deprecated", DeprecationWarning)

with warnings.catch_warnings(record=True) as w:
    # делаем так, чтобы все предупреждения всегда срабатывали.
    warnings.simplefilter("always")
    # Вызываем предупреждение.
    fxn()
    # А здесь тестируем
    assert len(w) == 1
    assert issubclass(w[-1].category, DeprecationWarning)
    assert "deprecated" in str(w[-1].message)