在被压制之后控制警告的外观

时间:2013-01-08 02:04:52

标签: python warnings

考虑一下:

>>> import warnings
>>> warnings.filterwarnings("always", category=DeprecationWarning)
>>> warnings.warn("Hello", DeprecationWarning)
/usr/bin/bpython:2: DeprecationWarning: Hello

好的,那里有警告。

>>> warnings.filterwarnings("ignore", category=DeprecationWarning)
>>> warnings.warn("Silence", DeprecationWarning)

此处没有警告。

>>> warnings.filterwarnings("always", category=DeprecationWarning)
>>> warnings.warn("Silence", DeprecationWarning) # why remain silent?
>>>

此处没有警告,但 应该是我所看到的所有警告。如果你删除python 2和3上的“ignore”过滤器,也会发生同样的情况。

虽然原则上这不应该是一个问题,(除非有另一个原因),我在某个地方创建了这个静音警告而没有意识到。这使得很难确定警告是否在给定的警告环境中得到控制。

注意:在脚本中,此示例正常工作。但是我原来的问题可能只与这个例子类似,所以我怀疑它仅限于交互式提示。在原始问题中,即使warnings.filters中的第一个过滤器与“always”(我检查过)匹配,我也看不到任何警告。

1 个答案:

答案 0 :(得分:3)

好的,我猜这个具体问题实际上是由bug report回答的。不幸的是,这似乎并不是我的问题,但这是另一回事......

如果有人感兴趣...我的原始问题仅仅是由于忘记了warnings.filters使用正则表达式re.match并且需要匹配字符串的开头。

在测试function

的弃用警告时,请避免此问题
if hasattr(function, '__globals__'):
    if function.__globals__.has_key('__warningregistry__'):
        function.__globals__['__warningregistry__'].clear()

至少在我的情况下这有帮助。 (测试另一个时忽略了一个警告,然后在测试第一个被忽略的警告时触发了此问题)