如何获得warnings.warn发出警告而不忽略该行?

时间:2014-01-06 22:01:32

标签: python python-2.7 warnings suppress-warnings

我正在尝试使用基于文档中显示的示例的代码段来引发DeprecationWarninghttp://docs.python.org/2/library/warnings.html#warnings.warn

官方

def deprecation(message):
    warnings.warn(message, DeprecationWarning, stacklevel=2)

import warnings
warnings.warn("This is a warnings.", DeprecationWarning, stacklevel=2) is None  # returns True

我尝试删除stacklevel参数,将其设置为负数,0,2和20000.警告始终以静默方式吞下。它不会发出警告或引发异常。它只是忽略该行并返回None。文档没有提到忽略的标准。发送消息,使warnings.warn正确发出Userwarning.

导致这种情况的原因是什么?如何警告实际发出警告?

3 个答案:

答案 0 :(得分:29)

来自文档:

  

默认情况下,Python安装了几个警告过滤器,可以是   被传递给-W和调用的命令行选项覆盖   filterwarnings()。

     
      
  • 将忽略弃权警告和待处理的警告以及导入警告。
  •   
  • 除非给出-b选项一次或两次,否则忽略BytesWarning;在这种情况下,此警告可以打印(-b)或转换为   例外(-bb)。
  •   

默认情况下,DeprecationWarning会被忽略。您可以使用以下方法更改过滤器:

warnings.simplefilter('always', DeprecationWarning)

现在应该打印出警告:

>>> import warnings
>>> warnings.simplefilter('always', DeprecationWarning)
>>> warnings.warn('test', DeprecationWarning)
/home/guest/.env/bin/ipython:1: DeprecationWarning: test
  #!/home/guest/.env/bin/python

答案 1 :(得分:8)

警告模块根据特定条件实施警告过滤。您可以通过打印warnings.filters

来显示默认过滤器
$ python -c "import warnings; print warnings.filters"
[('ignore', None, <type 'exceptions.DeprecationWarning'>, None, 0),
 ('ignore', None, <type 'exceptions.PendingDeprecationWarning'>, None, 0),
 ('ignore', None, <type 'exceptions.ImportWarning'>, None, 0),
 ('ignore', None, <type 'exceptions.BytesWarning'>, None, 0)]

如您所见,默认情况下会忽略DeprecationWarning。您可以使用warnings模块中的函数和Python的-W command-line option中的函数来配置过滤器 - 有关详细信息,请参阅文档。

示例:

$ python -Wall
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import warnings
>>> warnings.warn("test", DeprecationWarning)
__main__:1: DeprecationWarning: test

答案 2 :(得分:0)

$ python-墙 Python 2.7.3(默认,2013年9月26日,20:03:06) linux2上的[GCC 4.6.3] 输入“帮助”,“版权”,“信用”或“许可证”以获取更多信息。

  
    
      

导入警告       warnings.warn(“ test”,DeprecationWarning)       主要:1:弃用警告:测试