Фильтровать предупреждения, когда модуль переопределяет список фильтров
Я устанавливаю модели 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 и объяснить вашу ситуацию. Просто добавление аргумента в функцию, чтобы решить, отправлять предупреждения или нет, кажется мне хорошей идеей.