Перейти к содержимому

warnings – Управление предупреждениями

Исходный код: Lib/warnings.py


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

Программисты на Python выводят предупреждения, вызывая функцию warn(), определённую в этом модуле. (Программисты на C используют PyErr_WarnEx(); подробнее см. Обработка исключений).

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

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

Решение о том, выдавать ли предупреждение, управляется фильтром предупреждений, который представляет собой последовательность правил сопоставления и действий. Правила можно добавить в фильтр, вызвав filterwarnings(), и сбросить в состояние по умолчанию, вызвав resetwarnings().

Вывод предупреждений выполняется вызовом showwarning(), который может быть переопределён; реализация по умолчанию этой функции форматирует сообщение, вызывая formatwarning(), который также доступен для использования пользовательскими реализациями.

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

logging.captureWarnings() позволяет обрабатывать все предупреждения с помощью стандартной инфраструктуры логирования.

Warning CategoriesКатегории предупреждений

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

Хотя технически это встроенные исключения, они документированы здесь, поскольку концептуально относятся к механизму предупреждений.

Пользовательский код может определять дополнительные категории предупреждений, создавая подклассы одной из стандартных категорий предупреждений. Категория предупреждений всегда должна быть подклассом класса Warning.

В настоящее время определены следующие классы категорий предупреждений:

Класс

Описание

Warning

Это базовый класс всех классов категорий предупреждений. Он является подклассом Exception.

UserWarning

Категория по умолчанию для warn().

DeprecationWarning

Базовая категория для предупреждений об устаревших функциях, когда эти предупреждения предназначены для других разработчиков Python (игнорируется по умолчанию, если только не вызвано кодом в __main__).

SyntaxWarning

Базовая категория для предупреждений о сомнительных синтаксических особенностях (обычно выдаётся при компиляции исходного кода Python и поэтому может не подавляться фильтрами времени выполнения).

RuntimeWarning

Базовый класс для предупреждений о сомнительных особенностях выполнения.

FutureWarning

Базовый класс для предупреждений об устаревших возможностях, когда такие предупреждения предназначены для конечных пользователей приложений, написанных на Python.

PendingDeprecationWarning

Базовый класс для предупреждений о возможностях, которые будут объявлены устаревшими в будущем (по умолчанию игнорируются).

ImportWarning

Базовый класс для предупреждений, возникающих в процессе импорта модуля (по умолчанию игнорируются).

UnicodeWarning

Базовый класс для предупреждений, связанных с Unicode.

BytesWarning

Базовый класс для предупреждений, связанных с bytes и bytearray.

ResourceWarning

Базовый класс для предупреждений, связанных с использованием ресурсов (по умолчанию игнорируются).

Изменено в версии 3.7: Ранее DeprecationWarning и FutureWarning различались в зависимости от того, удалялась ли возможность полностью или менялось её поведение. Теперь они различаются по целевой аудитории и способу обработки фильтрами предупреждений по умолчанию.

The Warnings FilterФильтр предупреждений

Фильтр предупреждений определяет, будут ли предупреждения игнорироваться, отображаться или превращаться в ошибки (вызывать исключение).

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

  • action – одна из следующих строк:

    Значение

    Действие

    "default"

    выводить первое вхождение соответствующих предупреждений для каждого местоположения (модуль + номер строки), где было выдано предупреждение

    "error"

    превращать соответствующие предупреждения в исключения

    "ignore"

    никогда не выводить соответствующие предупреждения

    "always"

    всегда выводить соответствующие предупреждения

    "all"

    псевдоним для «always»

    "module"

    выводить первое вхождение соответствующих предупреждений для каждого модуля, где было выдано предупреждение (независимо от номера строки)

    "once"

    выводить только первое вхождение соответствующих предупреждений, независимо от местоположения

  • message – строка, содержащая регулярное выражение, с которым должно совпадать начало сообщения предупреждения (без учёта регистра). В -W и PYTHONWARNINGS, если message начинается и заканчивается косой чертой (/), оно задаёт регулярное выражение, как указано выше; в противном случае это литеральная строка, с которой должно совпадать начало сообщения предупреждения (без учёта регистра), игнорируя пробельные символы в начале и конце message.

  • category – класс (подкласс Warning), подклассом которого должна быть категория предупреждения для совпадения.

  • module – строка, содержащая регулярное выражение, с которым должно совпадать начало полного имени модуля (с учётом регистра). В -W и PYTHONWARNINGS, если module начинается и заканчивается косой чертой (/), оно задаёт регулярное выражение, как указано выше; в противном случае это литеральная строка, которой должно быть равно полное имя модуля (с учётом регистра), игнорируя пробельные символы в начале и конце module.

  • lineno – целое число, которому должен соответствовать номер строки, где возникло предупреждение, или 0 для соответствия всем номерам строк.

Поскольку класс Warning является подклассом встроенного класса Exception, чтобы превратить предупреждение в ошибку, мы просто возбуждаем category(message).

Если предупреждение зарегистрировано и не соответствует ни одному зарегистрированному фильтру, то применяется действие «default» (отсюда его название).

Repeated Warning Suppression CriteriaКритерии подавления повторных предупреждений

Фильтры, подавляющие повторные предупреждения, применяют следующие критерии для определения, считается ли предупреждение повторным:

  • "default": Предупреждение считается повторным, только если (message, category, module, lineno) все совпадают.

  • "module": Предупреждение считается повторным, если (message, category, module) совпадают, игнорируя номер строки.

  • "once": Предупреждение считается повторным, если (message, category) совпадают, игнорируя модуль и номер строки.

Describing Warning FiltersОписание фильтров предупреждений

Фильтр предупреждений инициализируется параметрами -W, переданными в командной строке интерпретатора Python, и переменной окружения PYTHONWARNINGS. Интерпретатор сохраняет аргументы всех переданных записей без интерпретации в sys.warnoptions; модуль warnings разбирает их при первом импорте (недопустимые параметры игнорируются после вывода сообщения в sys.stderr).

Отдельные фильтры предупреждений задаются в виде последовательности полей, разделённых двоеточиями:

python
action:message:category:module:line

Значение каждого из этих полей описано в Фильтр предупреждений. При перечислении нескольких фильтров в одной строке (как для PYTHONWARNINGS) отдельные фильтры разделяются запятыми, и фильтры, указанные позже, имеют приоритет над указанными ранее (поскольку они применяются слева направо, а самые недавно применённые фильтры имеют приоритет над более ранними).

Обычно используемые фильтры предупреждений применяются либо ко всем предупреждениям, либо к предупреждениям определённой категории, либо к предупреждениям, вызываемым определёнными модулями или пакетами. Некоторые примеры:

python
default                      # Показывать все предупреждения (даже игнорируемые по умолчанию)
ignore                       # Игнорировать все предупреждения
error                        # Преобразовывать все предупреждения в ошибки
error::ResourceWarning       # Обрабатывать сообщения ResourceWarning как ошибки
default::DeprecationWarning  # Показывать сообщения DeprecationWarning
ignore,default:::mymodule    # Сообщать только о предупреждениях, вызванных "mymodule"
error:::mymodule             # Преобразовывать предупреждения в ошибки в "mymodule"

Default Warning FilterФильтр предупреждений по умолчанию

По умолчанию Python устанавливает несколько фильтров предупреждений, которые можно переопределить с помощью параметра командной строки -W, переменной окружения PYTHONWARNINGS и вызовов filterwarnings().

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

python
default::DeprecationWarning:__main__
ignore::DeprecationWarning
ignore::PendingDeprecationWarning
ignore::ImportWarning
ignore::ResourceWarning

В отладочной сборке список фильтров предупреждений по умолчанию пуст.

Изменено в версии 3.2: DeprecationWarning теперь игнорируется по умолчанию в дополнение к PendingDeprecationWarning.

Изменено в версии 3.7: DeprecationWarning снова показывается по умолчанию при непосредственном вызове из кода в __main__.

Изменено в версии 3.7: BytesWarning больше не появляется в списке фильтров по умолчанию, а вместо этого настраивается через sys.warnoptions, когда -b указан дважды.

Overriding the default filterПереопределение фильтра по умолчанию

Разработчики приложений на Python могут захотеть скрыть все предупреждения уровня Python от пользователей по умолчанию и показывать их только при запуске тестов или другой работе над приложением. Атрибут sys.warnoptions, используемый для передачи конфигураций фильтра интерпретатору, можно использовать как маркер, указывающий, следует ли отключать предупреждения:

python
import sys

if not sys.warnoptions:
    import warnings
    warnings.simplefilter("ignore")

Разработчикам средств запуска тестов для Python рекомендуется вместо этого обеспечить отображение всех предупреждений по умолчанию для тестируемого кода, используя код вроде:

python
import sys

if not sys.warnoptions:
    import os, warnings
    warnings.simplefilter("default") # Изменить фильтр в этом процессе
    os.environ["PYTHONWARNINGS"] = "default" # Также влиять на подпроцессы

Наконец, разработчикам интерактивных оболочек, выполняющих пользовательский код в пространстве имён, отличном от __main__, рекомендуется обеспечить, чтобы сообщения DeprecationWarning были видны по умолчанию, используя код вроде следующего (где user_ns – модуль, используемый для выполнения кода, введённого в интерактивном режиме):

python
import warnings
warnings.filterwarnings("default", category=DeprecationWarning,
                                   module=user_ns.get("__name__"))

Temporarily Suppressing WarningsВременное подавление предупреждений

Если вы используете код, который, как вы знаете, вызовет предупреждение (например, устаревшую функцию), но не хотите видеть это предупреждение (даже если предупреждения были явно настроены через командную строку), то можно подавить предупреждение с помощью контекстного менеджера catch_warnings:

python
import warnings

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

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

Внутри контекстного менеджера все предупреждения просто игнорируются. Это позволяет использовать заведомо устаревший код без необходимости видеть предупреждение, не подавляя при этом предупреждения для другого кода, который может не знать об использовании устаревших возможностей.

Примечание

См. Потокобезопасность контекстных менеджеров для подробностей о безопасности параллельного выполнения контекстного менеджера catch_warnings при использовании в программах с несколькими потоками или асинхронными функциями.

Testing WarningsТестирование предупреждений

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

python
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)

Также можно сделать так, чтобы все предупреждения вызывали исключения, используя error вместо always. Следует помнить, что если предупреждение уже было вызвано из-за правила once/default, то, независимо от установленных фильтров, оно не будет показано снова, пока не будет очищен реестр предупреждений, связанный с этим предупреждением.

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

Примечание

См. Потокобезопасность контекстных менеджеров для подробностей о безопасности параллельного выполнения контекстного менеджера catch_warnings при использовании в программах с несколькими потоками или асинхронными функциями.

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

Updating Code For New Versions of DependenciesОбновление кода для новых версий зависимостей

Категории предупреждений, представляющие интерес в первую очередь для разработчиков Python (а не для конечных пользователей приложений на Python), по умолчанию игнорируются.

Примечательно, что в этот список «игнорируемых по умолчанию» входит DeprecationWarning (для всех модулей, кроме __main__), что означает, что разработчикам следует тестировать свой код с отображением обычно игнорируемых предупреждений, чтобы своевременно получать уведомления о будущих ломающих изменениях API (будь то в стандартной библиотеке или сторонних пакетах).

В идеальном случае у кода будет подходящий набор тестов, и средство запуска тестов позаботится о неявном включении всех предупреждений при запуске тестов (средство запуска тестов из модуля unittest делает это).

В менее идеальных случаях приложения можно проверить на использование устаревших интерфейсов, передав -Wd интерпретатору Python (это сокращение от -W default) или установив PYTHONWARNINGS=default в окружении. Это включает обработку по умолчанию для всех предупреждений, включая те, что игнорируются по умолчанию. Чтобы изменить действие, выполняемое при обнаружении предупреждений, можно изменить аргумент, передаваемый -W (например, -W error). См. флаг -W для получения дополнительной информации о возможностях.

Available FunctionsДоступные функции

warnings.warn(message, category=None, stacklevel=1, source=None, *, skip_file_prefixes=())

Выдает предупреждение, либо игнорирует его, либо возбуждает исключение. Аргумент category, если задан, должен быть классом категории предупреждений; по умолчанию UserWarning. В качестве альтернативы, message может быть экземпляром Warning, и в этом случае category игнорируется и используется message.__class__. В этом случае текст сообщения будет str(message). Эта функция возбуждает исключение, если выданное предупреждение преобразуется в ошибку с помощью фильтра предупреждений. Аргумент stacklevel может использоваться функциями-обертками, написанными на Python, например:

python
def deprecated_api(message):
    warnings.warn(message, DeprecationWarning, stacklevel=2)

Это заставляет предупреждение ссылаться на вызывающий код deprecated_api, а не на источник самого deprecated_api (поскольку последнее лишило бы смысла сообщение предупреждения).

Именованный аргумент skip_file_prefixes позволяет указать, какие кадры стека игнорировать при подсчете уровней стека. Это может быть полезно, если требуется, чтобы предупреждение всегда появлялось в местах вызова за пределами пакета, когда фиксированное значение stacklevel не подходит для всех путей вызова или его сложно поддерживать. Если задан, он должен быть кортежем строк. Когда префиксы указаны, stacklevel неявно переопределяется как max(2, stacklevel). Чтобы предупреждение приписывалось вызывающему коду за пределами текущего пакета, можно написать:

python
# example/lower.py
_warn_skips = (os.path.dirname(__file__),)

def one_way(r_luxury_yacht=None, t_wobbler_mangrove=None):
    if r_luxury_yacht:
        warnings.warn("Please migrate to t_wobbler_mangrove=.",
                      skip_file_prefixes=_warn_skips)

# example/higher.py
from . import lower

def another_way(**kw):
    lower.one_way(**kw)

Это делает так, что предупреждение относится к обоим местам вызова example.lower.one_way() и example.higher.another_way() только для вызывающего кода, находящегося за пределами пакета example.

source, если задан, представляет собой уничтоженный объект, который породил ResourceWarning.

Изменено в версии 3.6: Добавлен параметр source.

Изменено в версии 3.12: Добавлен skip_file_prefixes.

warnings.warn_explicit(message, category, filename, lineno, module=None, registry=None, module_globals=None, source=None)

Это низкоуровневый интерфейс к функциональности warn(), в который явно передаются сообщение, категория, имя файла и номер строки, а также опционально другие аргументы. message должен быть строкой, а category – подклассом Warning, или message может быть экземпляром Warning, и в этом случае category будет проигнорирован.

module, если задан, должен быть именем модуля. Если модуль не передан, регулярное выражение модуля из фильтра предупреждений будет проверяться на соответствие именам модулей, построенным из компонентов пути, начиная со всех родительских каталогов (с удаленными /__init__.py, .py и, в Windows, .pyw) и по имени файла с удаленным .py. Например, если имя файла – '/path/to/package/module.py', он будет проверен на соответствие 'path.to.package.module', 'to.package.module', 'package.module', 'module' и '/path/to/package/module'.

registry, если задан, должен быть словарем __warningregistry__ модуля. Если реестр не передан, каждое предупреждение рассматривается как первое появление, то есть действия фильтра "default", "module" и "once" обрабатываются как "always".

module_globals, если задан, должен быть глобальным пространством имен, используемым кодом, для которого выдается предупреждение. (Этот аргумент используется для поддержки отображения исходного кода модулей, найденных в zip-файлах или других не файловых источниках импорта).

source, если задан, представляет собой уничтоженный объект, который породил ResourceWarning.

Изменено в версии 3.6: Добавлен параметр source.

Изменено в версии 3.15: Если модуль не передан, проверяйте регулярное выражение фильтра на соответствие именам модулей, созданным из пути, а не только самому пути.

warnings.showwarning(message, category, filename, lineno, file=None, line=None)

Записывает предупреждение в файл. Реализация по умолчанию вызывает formatwarning(message, category, filename, lineno, line) и записывает результирующую строку в file, который по умолчанию равен sys.stderr. Вы можете заменить эту функцию любой вызываемой, присвоив её warnings.showwarning. line – это строка исходного кода, которая будет включена в сообщение предупреждения; если line не задан, showwarning() попытается прочитать строку, указанную filename и lineno.

warnings.formatwarning(message, category, filename, lineno, line=None)

Форматирует предупреждение стандартным образом. Возвращает строку, которая может содержать встроенные символы новой строки и заканчивается новой строкой. line – это строка исходного кода, которая будет включена в сообщение предупреждения; если line не задан, formatwarning() попытается прочитать строку, указанную filename и lineno.

warnings.filterwarnings(action, message='', category=Warning, module='', lineno=0, append=False)

Вставляет запись в список спецификаций фильтра предупреждений. По умолчанию запись вставляется в начало; если append равен true, она вставляется в конец. Эта функция проверяет типы аргументов, компилирует регулярные выражения message и module и вставляет их в виде кортежа в список фильтров предупреждений. Записи, находящиеся ближе к началу списка, переопределяют записи, находящиеся позже, если обе соответствуют конкретному предупреждению. Опущенные аргументы по умолчанию принимают значение, которое соответствует всему.

warnings.simplefilter(action, category=Warning, lineno=0, append=False)

Вставляет простую запись в список спецификаций фильтра предупреждений. Смысл параметров функции такой же, как у filterwarnings(), но регулярные выражения не требуются, так как вставленный фильтр всегда соответствует любому сообщению в любом модуле, если совпадают категория и номер строки.

warnings.resetwarnings()

Сбрасывает фильтр предупреждений. Это отменяет действие всех предыдущих вызовов filterwarnings(), включая вызовы из параметров командной строки -W и вызовы simplefilter().

@warnings.deprecated(msg, *, category=DeprecationWarning, stacklevel=1)

Декоратор, указывающий, что класс, функция или перегрузка устарели.

Когда этот декоратор применяется к объекту, во время выполнения при использовании объекта могут выдаваться предупреждения об устаревании. Статические проверки типов также будут генерировать диагностику при использовании устаревшего объекта.

Использование:

python
from warnings import deprecated
from typing import overload

@deprecated("Use B instead")
class A:
    pass

@deprecated("Use g instead")
def f():
    pass

@overload
@deprecated("int support is deprecated")
def g(x: int) -> int: ...
@overload
def g(x: str) -> int: ...

Предупреждение, указанное category, будет выдаваться во время выполнения при использовании устаревших объектов. Для функций это происходит при вызовах; для классов – при создании экземпляров и создании подклассов. Если category равен None, предупреждение во время выполнения не выдается. Аргумент stacklevel определяет, где выдается предупреждение. Если он равен 1 (по умолчанию), предупреждение выдается в прямом вызывающем коде устаревшего объекта; если он выше, оно выдается выше по стеку. Поведение статических проверок типов не зависит от аргументов category и stacklevel.

Сообщение об устаревании, переданное декоратору, сохраняется в атрибуте __deprecated__ декорированного объекта. Если применяется к перегрузке, декоратор должен быть после декоратора @~typing.overload, чтобы атрибут существовал для перегрузки, возвращаемой typing.get_overloads().

Добавлено в версии 3.13: См. PEP 702.

Available Context ManagersДоступные менеджеры контекста

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

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

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

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

Смотрите Фильтр предупреждений для пояснения параметров category и lineno.

Примечание

Смотрите Потокобезопасность менеджеров контекста для подробностей о потокобезопасности менеджера контекста catch_warnings при использовании в программах с несколькими потоками или асинхронными функциями.

Изменено в версии 3.11: Добавлены параметры action, category, lineno и append.

Concurrent safety of Context ManagersБезопасность менеджеров контекста при параллельном выполнении

Поведение менеджера контекста catch_warnings зависит от флага sys.flags.context_aware_warnings. Если флаг истинен, то менеджер контекста ведёт себя безопасно при параллельном выполнении, в противном случае – нет. Безопасность при параллельном выполнении означает, что он одновременно потокобезопасен и безопасен для использования внутри корутин asyncio и задач. Потокобезопасность означает, что поведение предсказуемо в многопоточной программе. По умолчанию флаг истинен для free-threaded сборок и ложен в противном случае.

Если флаг context_aware_warnings ложен, то catch_warnings будет изменять глобальные атрибуты модуля warnings. Это небезопасно при использовании в программе с параллельным выполнением (с использованием нескольких потоков или корутин asyncio). Например, если два или более потоков одновременно используют класс catch_warnings, поведение неопределено.

Если флаг истинен, catch_warnings не будет изменять глобальные атрибуты, а вместо этого будет использовать ContextVar для хранения вновь установленного состояния фильтрации предупреждений. Переменная контекста обеспечивает хранилище, локальное для потока, что делает использование catch_warnings потокобезопасным.

Параметр record обработчика контекста также ведёт себя по-разному в зависимости от значения флага. Когда record истинен и флаг ложен, менеджер контекста работает, заменяя, а затем восстанавливая функцию showwarning() модуля. Это небезопасно при параллельном выполнении.

Когда record истинен и флаг истинен, функция showwarning() не заменяется. Вместо этого состояние записи указывается внутренним свойством в переменной контекста. В этом случае функция showwarning() не будет восстановлена при выходе из обработчика контекста.

Флаг context_aware_warnings можно установить с помощью параметра командной строки -X context_aware_warnings или переменной окружения PYTHON_CONTEXT_AWARE_WARNINGS.

Примечание

Вероятно, что большинство программ, которым требуется потокобезопасное поведение модуля warnings, также захотят установить флаг thread_inherit_context в истину. Этот флаг заставляет потоки, создаваемые threading.Thread, начинать с копии переменных контекста из потока, создающего их. При истине контекст, установленный catch_warnings в одном потоке, будет также применяться к новым потокам, запущенным им. При лжи новые потоки будут начинать с пустой переменной контекста warnings, что означает, что любая фильтрация, установленная менеджером контекста catch_warnings, больше не будет активна.

Изменено в версии 3.14: Добавлены флаг sys.flags.context_aware_warnings и использование переменной контекста для catch_warnings, если флаг истинен. Предыдущие версии Python вели себя так, как будто флаг всегда был установлен в ложь.