当模块覆盖过滤器列表时过滤警告

Filter warnings when module overrides filter list

我正在使用 ARCH package 为每个月的每一天拟合来自数千个传感器的数据的 GARCH 模型。我知道所有数据都不是干净的,模型可能不会针对某些传感器收敛,我对此没有意见。我计划稍后在每个传感器的基础上处理它们。

我的问题是 Python 处理警告的方式。根据 Warnings documentation:

Conceptually, the warnings filter maintains an ordered list of filter specifications; any specific warning is matched against each filter specification in the list in turn until a match is found; the match determines the disposition of the match.

这基本上意味着

warnings.simplefilter('ignore')

将附加到列表的头部。

但是,在 ARCH package 中,在 /arch/base.py 中,line 507 读取:

warnings.simplefilter('always')

这实际上是在每次调用 ARCH 的模型拟合方法时将 'always' 附加到警告过滤器的开头。这确保始终显示警告,因为我只能在调用 .fit() 之前或之后将 'ignore' 添加到列表的头部(这将被 'always' 在下次调用。由于我的问题涉及数千个传感器,它会打印出数千条警告,这会使 Jupyter notebook 变得缓慢。

有没有办法在所有情况下都忽略警告?像警告的超级过滤器会很棒。

他们每次都重置过滤器,所以除了劫持 warn 函数,我看不到任何其他解决方案。

当您导入 Python 模块时,它会存储在字典 sys.modules 中供以后使用。因此,在ARCH包之前导入一次warnings模块就足够了:

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

# do stuff which might trigger warnings

我承认这是一个丑陋的解决方案。但作为一种快速破解,它应该能达到目的。


作为一个长期的解决方案,我建议您打开一个 PR 并说明您的情况。简单地向函数添加一个参数来决定是否发出警告对我来说似乎是个好主意。