Python再次显示“一次”警告(重置所有警告注册表)

2024-10-04 07:32:13 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法一次重置所有加载函数的__warningregistry__?在

我想强制使用“一次”筛选器筛选的所有警告再次显示。除了对加载的每个函数(包括导入模块的函数)调用<func>.__globals__['__warningregistry__'].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()函数也能清除所有的警告注册表,而不仅仅是当前的名称空间。在

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


Tags: 模块函数警告rootat重置warnfunc
2条回答

我不相信这个功能存在,至少在2.7.6中没有。我看了看警告.py我和c没有找到任何可以用来做这件事的东西。在

我在想也许你可以包装这个模块并重写列表中的warn()调用,将globals()[''\'uwarningregistry\']放到一个列表中,然后添加一个新的clear()函数来循环它并为所有调用重置注册表。在

这个功能似乎并不直接存在于Python中。在

但是,我需要为我自己的库的unittests提供类似的功能,并且开发了一个上下文管理器,它可以备份整个进程的警告注册表状态,清除它,然后在上下文完成后恢复它。在

这里的文章有点太长了,但是我已经将它作为解决python bug 21724的潜在起点提交,因此您应该能够直接从http://bugs.python.org/file40031/reset_warning_registry.py下载并使用它

用法如下:

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__()

相关问题 更多 >