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:很好,我也需要它。