Python warnings.warn()与logging.warning()

hek*_*ran 54 python logging warnings

之间有什么区别warnings.warn(),并logging.warn()在他们做了什么样的条件和应如何使用?

cxr*_*ers 60

我同意另一个答案 - logging用于记录并warning用于警告 - 但我想添加更多细节.

这是一个教程式的HOWTO,带您了解使用该logging模块的步骤. http://docs.python.org/2/howto/logging.html

它直接回答了你的问题:

如果问题可以避免,则库代码中的warnings.warn()应该修改客户端应用程序以消除警告

logging.warning()如果客户端应用程序无法处理该情况,但仍应注意该事件


Mar*_*ery 35

logging.warning只需在WARNING级别记录一些内容,就像在级别logging.info记录INFOlogging.error记录ERROR级别一样.它没有特殊的行为.

warnings.warn发出a Warning,可以打印stderr,完全忽略,或抛出正常Exception(可能会使应用程序崩溃),具体取决于Warning发出的精确子类以及如何配置警告过滤器.默认情况下,将打印stderr或忽略警告.

发出的警告warnings.warn通常有助于了解,但容易遗漏(特别是如果您在后台进程中运行Python程序而不是捕获stderr).因此,记录它们会很有帮助.Python提供了logging模块和warnings模块之间的内置集成,让您可以做到这一点; 只需logging.captureWarnings(True)在脚本开头调用,warnings模块发出的所有警告都将自动记录在级别WARNING.


Ray*_*Luo 21

除了官方文档中规范解释

如果问题可以避免,则库代码中的warnings.warn()应该修改客户端应用程序以消除警告

logging.warning()如果客户端应用程序无法处理该情况,但仍应注意该事件

值得注意的是,默认情况下warnings.warn("same message")只会出现一次.这是一个重大的显着差异.引自官方文件

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

>>> 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")
>>>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“仅显示一次”是预期的默认行为,但警告过滤器可以更改此行为。 (4认同)

Ign*_*ams 9

一个引发可以根据需要捕获或忽略的异常,另一个可选地根据当前日志记录级别向日志添加条目.当一个人在代码中警告各种事情时应该使用一个,而在记录时应该使用另一个.

  • 据我了解,公认的答案是错误的。警告和日志均不会引发异常。但是打印消息。但是它们具有不同的系统性(但是可以通过logging.captureWarnings()将警告集成到日志中)。默认情况下,警告消息仅显示一次,如@cxrodgers解释告诉用户更改其代码。登录另一个并记录所有警告,但是可以配置详细显示的内容。使用-W error可以向异常发出警告。 (8认同)