首页 > 解决方案 > scipy覆盖警告过滤器?

问题描述

似乎一些 scipy 模块正在弄乱我的警告过滤器。考虑以下代码。我的理解是,由于我提供给自定义警告类的“一次”过滤器,它应该只抛出一个警告。但是,scipy 导入后的警告也会显示出来。这适用于 python 3.7 和 scipy 1.6.3。

import warnings
class W(DeprecationWarning): pass
warnings.simplefilter("once", W)

warnings.warn('warning!', W)
warnings.warn('warning!', W)

from scipy import interpolate

warnings.warn('warning!', W)

这似乎只在我导入某些 scipy 模块时发生。通用的“import scipy”不会这样做。

我已将其范围缩小到 和 中设置的过滤scipy.special.sf_error.pyscipy.sparse.__init__.py。我看不出该代码将如何导致问题,但确实如此。当我评论这些过滤器时,我的代码按预期工作。

我是不是误会了什么?是否有不涉及覆盖warnings.filterwarnings/的解决方法warnings.simplefilters

标签: pythonscipy

解决方案


这是一个开放的 Python 错误:https ://bugs.python.org/issue29672 。

请特别注意Tom Aldcroft 评论的最后一部分:

即使是文档更新也会很有用。这不仅可以解释catch_warnings(),而且通常可以解释意外的特性,即如果堆栈中的任何包设置了警告过滤器,则全局重置之前是否已看到警告(通过调用_filters_mutated())。

中的代码scipy/special/sf_error.py设置了一个警告过滤器,这会导致全局重置之前已经看到的警告。(如果您warnings.warn('warning!', W)在示例代码的末尾添加另一个调用,您应该会看到它不会引发警告。)


推荐阅读