【问题标题】:Control appearance of warnings after they were once supressed在警告被抑制后控制警告的出现
【发布时间】:2013-01-08 02:04:52
【问题描述】:

考虑一下:

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

OK 那里收到警告。

>>> 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 中的第一个过滤器应该与“always”匹配(我检查过),我也没有看到任何警告。

【问题讨论】:

  • 你想reset the warnings吗?
  • @mgilson,基本上是的,但它不起作用......基本上我想保存和恢复警告上下文,这使它无法像我预期的那样工作。
  • 我无法重现您所说的内容。将其放入脚本时,我看到 2 个警告。
  • @mgilson,是的,你就在我得到相同的脚本中,所以这与交互式提示有关,但这并不能说服我......
  • 您说的很对,与交互式提示相比,这在脚本中的行为确实不同。您可能应该在问题中明确说明。

标签: python warnings


【解决方案1】:

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

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

为避免在测试 function 的弃用警告时出现此问题

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

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

【讨论】:

  • 非常感谢您分享这个技巧!只有 Python2 受到影响。
猜你喜欢
  • 2011-12-28
  • 2011-03-31
  • 2019-10-22
  • 2014-12-19
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多