warnings.warn()
和logging.warn()
在做什么以及应该如何使用方面有什么区别?
答案 0 :(得分:49)
我同意另一个答案 - logging
用于记录,warning
用于警告 - 但我想添加更多详细信息。
这是一个教程式的HOWTO,带您了解使用logging
模块的步骤。
http://docs.python.org/2/howto/logging.html
它直接回答了你的问题:
如果问题是可以避免的,那么库代码中的warnings.warn()和 应修改客户端应用程序以消除警告
logging.warning()如果客户端应用程序无法执行任何操作 关于情况,但仍应注意事件
答案 1 :(得分:28)
logging.warning
只需记录WARNING
级别的内容,就像logging.info
在INFO
级别记录和logging.error
日志ERROR
级别一样1}}级别。它没有特殊的行为。
warnings.warn
会发出Warning
,可能会打印到stderr
,完全被忽略,或者像普通Exception
一样被抛出(可能会导致应用程序崩溃),具体取决于具体情况已发出Warning
个子类以及您如何配置警告过滤器。默认情况下,警告将打印到stderr
或忽略。
warnings.warn
发出的警告通常很有用,但很容易被忽略(特别是如果您在后台进程中运行Python程序而不是捕获stderr
)。因此,记录它们会很有帮助。 Python提供了logging
模块和warnings
模块之间的内置集成,让您可以执行此操作;只需在脚本开头调用logging.captureWarnings(True)
,warnings
模块发出的所有警告都会自动记录在WARNING
级。
答案 2 :(得分:16)
除了canonical explanation in official documentation
如果问题是可以避免的,那么库代码中的warnings.warn()应该修改客户端应用程序以消除警告
logging.warning()如果客户端应用程序无法处理该情况,但仍应注意该事件
值得注意的是,默认情况下warnings.warn("same message")
只会出现一次。这是一个重大的显着差异。引自official doc
通常会抑制对同一源位置的特定警告的重复。
>>> import warnings
>>> warnings.warn("foo")
__main__:1: UserWarning: foo
>>> warnings.warn("foo")
>>> warnings.warn("foo")
>>>
>>> import logging
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>> logging.warn("bar")
WARNING:root:bar
>>>
>>>
>>> warnings.warn("fur")
__main__:1: UserWarning: fur
>>> warnings.warn("fur")
>>> warnings.warn("fur")
>>>
答案 3 :(得分:10)
一个引发可以根据需要捕获或忽略的异常,另一个可选地根据当前日志记录级别向日志添加条目。当一个人在代码中警告各种事情时应该使用一个,而在记录时应该使用另一个。