【问题标题】:Why only one warning in a loop?为什么循环中只有一个警告?
【发布时间】:2014-05-04 21:35:07
【问题描述】:

我希望针对循环中检测到的每个问题发出警告,但警告只发出一次,即第一次。例如:

import warnings

for i in range(10):
   print i
   warnings.warn('this is a warning message')

我希望:

0
UserWarning: this is a warning message
1
UserWarning: this is a warning message
2
UserWarning: this is a warning message
3
UserWarning: this is a warning message
4

但结果是:

0
__main__:4: UserWarning: this is a warning message
1
2
3
4

为什么我只有一个警告?如何获得每次迭代的警告?

【问题讨论】:

    标签: python loops warnings


    【解决方案1】:

    这是设计使然。请参阅http://docs.python.org/2/library/warnings.html 的文档:

    通常会禁止对同一源位置重复特定警告。

    您可以通过添加带有关键字always 的过滤器来覆盖此行为,如下所示:

    import warnings
    
    warnings.simplefilter('always', UserWarning)
    for i in range(10):
       print i
       warnings.warn('this is a warning message')
    

    【讨论】:

      【解决方案2】:

      来自warnings module documentation

      对于同一源位置的特定警告的重复通常会被禁止。

      这是设计使然。

      如果您希望您的消息被打印出来,我不会使用warnings 模块总是;您可以重置过滤器(使用 warnings.resetwarnings(),但非常建议这样做,因为您也会丢弃任何用户配置的过滤器。您可以添加一个显式过滤器,始终允许带有 @ 的消息987654323@:

      warnings.simplefilter('always', UserWarning)
      

      但我会直接写信给sys.stderr

      【讨论】:

      • 实际上resetwarnings 不会解决这个特定问题,因为它将警告过滤器重置为默认行为,即禁止重复警告。应该专门强制警告过滤器每次使用always 过滤器打印警告。
      【解决方案3】:

      在其他答案中已经提到,默认情况下,每个警告都会为它出现的每个源文件打印一次。但是,您可以从命令行轻松更改。通过说python -W all 来调用解释器:

      $ python -W all
      Python 2.7.6 (default, Mar 16 2014, 23:42:21)
      [GCC 4.5.3] on netbsd6
      Type "help", "copyright", "credits" or "license" for more information.
      >>> import warnings
      >>> for i in range(10):
         print i
         warnings.warn('this is a warning message')... ...
      ...
      0
      __main__:3: UserWarning: this is a warning message
      1
      __main__:3: UserWarning: this is a warning message
      2
      __main__:3: UserWarning: this is a warning message
      3
      __main__:3: UserWarning: this is a warning message
      4
      __main__:3: UserWarning: this is a warning message
      5
      __main__:3: UserWarning: this is a warning message
      6
      __main__:3: UserWarning: this is a warning message
      7
      __main__:3: UserWarning: this is a warning message
      8
      __main__:3: UserWarning: this is a warning message
      9
      __main__:3: UserWarning: this is a warning message
      >>>
      

      【讨论】:

        【解决方案4】:

        默认过滤器可防止您的警告多次出现 - 您可以使用 simplefilter 覆盖过滤器。

        import warnings
        
        warnings.simplefilter("always")
        for i in range(10):
            print i
            warnings.warn('this is a warning message')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-01-26
          • 2019-02-12
          • 1970-01-01
          • 1970-01-01
          • 2019-01-08
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多