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

#python #python-3.x #warnings #arch

#python #python-3.x #предупреждения #arch

Вопрос:

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

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

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

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

 warnings.simplefilter('ignore')
  

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

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

 warnings.simplefilter('always')
  

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

Есть ли способ игнорировать предупреждения при любых условиях? Например, суперфильтр для предупреждений был бы отличным.

Комментарии:

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

2. @rubik, я не знаю как… И опять же, они импортируются warnings при каждом вызове, поэтому, если я не изменю исходный код, я не вижу, как warn поможет захват функции в моем коде.

3. Модуль импортируется только один раз, а затем сохраняется sys.modules . Я изложу решение в ответе.

4. (Не связано с вопросом): Не могли бы вы добавить какую-то выдержку из тега в arch?

5. @Makoto, я сделал… Он проверяется. Есть ли способ ускорить процесс проверки?

Ответ №1:

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

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

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

# do stuff which might trigger warnings
  

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


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

Комментарии:

1. Пожалуйста, попробуйте это решение и сообщите об этом. Я попробовал это с некоторыми специальными файлами, и это сработало, но может случиться так, что пакет ARCH выполняет дополнительные хитрости с предупреждениями. Это решение защищает только от вызовов warnings.warn .

2. Спасибо. Я успешно попробовал. Я отмечу это как ответ. Я открыл проблему с пакетом ARCH на GH. Надеюсь, они скоро доберутся до этого.