2

考虑一下:

>>> 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 上的“忽略”过滤器,也会发生同样的情况。

虽然原则上这不应该是一个问题,(除非有其他原因),我在不知不觉中在某处创建了这个静音警告。这使得很难确定在给定的警告上下文中控制警告。

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

4

1 回答 1

3

好的,所以我猜这个错误报告实际上回答了这个特定问题。不幸的是,这似乎并不是我的问题,但那是另一回事......

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

为了在测试弃用警告时避免此问题function

if hasattr(function, '__globals__'):
    if function.__globals__.has_key('__warningregistry__'):
        function.__globals__['__warningregistry__'].clear()

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

于 2013-01-08T12:26:27.933 回答