为什么循环中只有一个警告?

问题描述 投票:0回答:4

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

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 python-3.x python-2.7 loops warnings
4个回答
60
投票

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

针对同一源位置的特定警告的重复通常会被抑制。

您可以通过添加带有关键字

"always"
的过滤器来覆盖此行为,如下所示:

import warnings

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

9
投票

来自

warnings
模块文档

针对同一源位置的特定警告的重复通常会被抑制。

这是设计使然。

如果您希望

始终
打印您的消息,我不会使用warnings模块;您可以重置过滤器(使用
warnings.resetwarnings()
,但非常不推荐这样做,因为您也会丢弃任何用户配置的过滤器。您可以添加一个显式过滤器,始终允许带有 warnings.simplefilter() 的消息功能
warnings.simplefilter('always', UserWarning)

但我会直接写信给
sys.stderr

    


5
投票

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 >>>



3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.