python-3.x 为什么循环中只有一个警告?

xxb16uws  于 2023-05-19  发布在  Python
关注(0)|答案(4)|浏览(220)

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

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

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

pnwntuvh

pnwntuvh1#

这是设计好的请参阅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')
von4xj4u

von4xj4u2#

关于warnings module documentation
对于相同源位置的特定警告的重复通常被抑制。
这是设计好的。
如果你想让你的消息总是被打印出来,我不会使用warnings模块;你可以重置过滤器(使用warnings.resetwarnings(),但这是非常推荐的,因为你也会丢弃任何用户配置的过滤器。您可以添加一个显式过滤器,始终允许使用warnings.simplefilter()函数的消息:

warnings.simplefilter('always', UserWarning)

但我会直接写sys.stderr

jslywgbw

jslywgbw3#

在其他答案中已经提到,默认情况下,每个警告会在每个源文件中打印一次。但是,您可以从命令行轻松更改。通过说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
>>>
yuvru6vn

yuvru6vn4#

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

import warnings

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

相关问题