Фильтровать предупреждения, когда модуль переопределяет список фильтров

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

Моя проблема в том, как Python обрабатывает предупреждения. Согласно документации предупреждений:

Концептуально фильтр предупреждений поддерживает упорядоченный список спецификаций фильтра; любое конкретное предупреждение сопоставляется с каждой спецификацией фильтра в списке по очереди, пока не будет найдено совпадение; совпадение определяет расположение совпадения.

Что в основном означает, что

warnings.simplefilter('ignore')

будет добавлен в начало списка.

Однако в пакете ARCH в /arch/base.py строка 507 гласит:

warnings.simplefilter('always')

который по существу добавляет 'always' к началу фильтра предупреждений каждый раз, когда вызывается метод подбора модели ARCH. Это гарантирует, что предупреждение всегда отображается, потому что я могу только добавить 'ignore' в начале списка до или после вызова .fit() (который будет переопределен 'always' в следующем звонке. Поскольку моя проблема связана с тысячами датчиков, она печатает тысячи предупреждений, которые замедляют работу ноутбука Jupyter.

Есть ли способ игнорировать предупреждения при любых условиях? Как супер фильтр для предупреждений будет здорово.

1 ответ

Решение

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

Когда вы импортируете модуль Python, он сохраняется в словаре sys.modules для последующего использования. Поэтому достаточно импортировать warnings модуль один раз и перед пакетом ARCH:

import warnings
warnings.warn = lambda *a, **kw: False

# do stuff which might trigger warnings

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


В качестве долгосрочного решения, я бы посоветовал вам открыть PR и объяснить вашу ситуацию. Просто добавление аргумента в функцию, чтобы решить, отправлять предупреждения или нет, кажется мне хорошей идеей.

Другие вопросы по тегам