我希望对循环中检测到的每个问题发出警告,但警告仅在第一次发出一次。例如:
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
为什么我只有一个警告?如何在每次迭代时收到警告?
这是设计使然。请参阅文档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')
warnings
模块文档:
针对同一源位置的特定警告的重复通常会被抑制。
这是设计使然。
如果您希望
始终打印您的消息,我不会使用
warnings
模块;您可以重置过滤器(使用 warnings.resetwarnings()
,但非常不推荐这样做,因为您也会丢弃任何用户配置的过滤器。您可以添加一个显式过滤器,始终允许带有 warnings.simplefilter()
的消息功能:
warnings.simplefilter('always', UserWarning)
但我会直接写信给
sys.stderr
。
:来调用口译员
$ 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
>>>
import warnings
warnings.simplefilter("always")
for i in range(10):
print i
warnings.warn('this is a warning message')