有没有办法立即重置__warningregistry__所有加载的函数?
我想强制所有使用'once'过滤器过滤的警告再次显示.除了调用<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 ...
Run Code Online (Sandbox Code Playgroud)
我希望此warnings.clear()功能还清除所有警告注册表,而不仅仅是当前的名称空间.
这已经存在了吗?也许我错过了一些明显的东西,或者错误地使用了模块?
该功能似乎不直接存在于Python中.
但是,我需要为我自己的库的单元测试提供类似的功能,并编写了一个上下文管理器,它为整个进程备份警告注册表状态,清除它,然后在上下文完成后恢复它.
在这里发帖有点太长了,但我已经提交它作为解决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__()
Run Code Online (Sandbox Code Playgroud)
我不相信这个功能存在,至少在 2.7.6 中不存在。我查看了 warnings.py 和 _warnings.c,但没有找到任何可以用来执行此操作的内容。
我在想也许你可以包装模块并重写warn()将 globals()['__warningregistry__'] 放入列表中的调用,并添加一个新clear()函数来循环它并重置所有调用的注册表。
| 归档时间: |
|
| 查看次数: |
736 次 |
| 最近记录: |