擅长:python、mysql、java
<p>Brian Luft关于问题的起因是<code>__warningregistry__</code>是正确的。但我想澄清一件事:这个<code>warnings</code>模块的工作方式是为每个调用<code>warn()</code>的模块设置<code>module.__warningregistry__</code>。更复杂的是,warnings的<code>stacklevel</code>选项会导致为发出警告的模块设置属性,而不一定是调用<code>warn()</code>的模块。。。这取决于发出警告时的调用堆栈。</p>
<p>这意味着您可能有很多不同的模块,其中存在<code>__warningregistry__</code>属性,并且根据您的应用程序,在您再次看到警告之前,它们可能都需要清除。我一直依赖下面的代码片段来完成这项工作。。。它清除名称与regexp匹配的所有模块的警告注册表(默认为<em>everything</em>):</p>
<pre><code>def reset_warning_registry(pattern=".*"):
"clear warning registry for all match modules"
import re
import sys
key = "__warningregistry__"
for mod in sys.modules.values():
if hasattr(mod, key) and re.match(pattern, mod.__name__):
getattr(mod, key).clear()
</code></pre>
<hr/>
<p>更新:CPython<a href="https://bugs.python.org/issue21724" rel="nofollow noreferrer">issue 21724</a>地址问题表明resetwarnings()未清除警告状态。我在这个问题上附加了一个扩展的“上下文管理器”版本,可以从<a href="https://bugs.python.org/file40031/reset_warning_registry.py" rel="nofollow noreferrer">reset_warning_registry.py</a>下载。</p>