Python-showing';一次';再次警告(重置所有警告注册表)

Python-showing';一次';再次警告(重置所有警告注册表),python,warnings,Python,Warnings,是否有一种方法可以立即重置所有加载函数的\uuuu警告注册表\uuuu 我想强制使用“一次”过滤器过滤的所有警告再次显示。除了在我加载的每个函数(包括导入模块的一部分)上调用。\uuuu globals\uuu[''.\ uuuu warningregistry\uuuu'].clear(),我没有找到其他方法来实现这一点 因此,我想要的是类似于warnings.clear()的函数来执行以下操作: >>> import warnings >>> warnin

是否有一种方法可以立即重置所有加载函数的
\uuuu警告注册表\uuuu

我想强制使用“一次”过滤器过滤的所有警告再次显示。除了在我加载的每个函数(包括导入模块的一部分)上调用
。\uuuu globals\uuu[''.\ uuuu warningregistry\uuuu'].clear()
,我没有找到其他方法来实现这一点

因此,我想要的是类似于
warnings.clear()的函数来执行以下操作:

>>> import warnings
>>> warnings.warn('blah')
WARNING:root:blah ->UserWarning at ...
>>> warnings.warn('blah')
>>> warnings.clear()
>>> warnings.warn('blah')
WARNING:root:blah ->UserWarning at ...
我希望这个
warnings.clear()
函数也能清除所有警告注册表,而不仅仅是当前的名称空间


这已经存在了吗?也许我遗漏了一些明显的东西,或者模块使用不正确?

我认为这个功能不存在,至少在2.7.6中不存在。我查看了warnings.py和_warnings.c,没有找到任何可以用来执行此操作的内容


我在想,也许您可以包装模块并覆盖
warn()
调用,将globals()[''''.\uu warningregistry\u'.]放入一个列表中,然后添加一个新的
clear()
函数来循环它,并为所有调用重置注册表。

Python中似乎不直接存在该功能

但是,我需要为我自己的库的单元测试提供类似的功能,并建立了一个上下文管理器,用于在整个过程中备份警告注册表状态,清除它,然后在上下文完成后恢复它

在这里发布有点太长了,但我已经提交了它作为解决问题的潜在起点,所以您应该能够直接从

用法如下:

from reset_warning_registry import reset_warning_registry

with reset_warning_registry():
    ... do things with clear registry ...

# alternately, to just clear the warnings w/o restoring
reset_warning_registry().__enter__()

我认为将过滤器设置为“始终”可以满足这一需求

> cat warnme.py 
import warnings

for i in range(3):
    warnings.warn("oh noes!")

> python warnme.py 
warnme.py:4: UserWarning: oh noes!
warnings.warn("oh noes!")

> cat warnme2.py 
import warnings

warnings.simplefilter("always")
for i in range(3):
    warnings.warn("oh noes!")

> python warnme2.py 
warnme2.py:5: UserWarning: oh noes!
warnings.warn("oh noes!")
warnme2.py:5: UserWarning: oh noes!
warnings.warn("oh noes!")
warnme2.py:5: UserWarning: oh noes!
warnings.warn("oh noes!")

下面是跟踪问题的Python bug:很好,我也需要它。