warnings.warn()与logging.warning()


Answers:


-5

一个引发了一个异常,可以根据需要捕获或忽略该异常,另一个则根据当前的日志记录级别将一个条目添加到日志中。当一种警告代码中的各种内容时,应使用一种,而在记录日志时,应使用另一种。


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

不好意思说,这个答案不是很有帮助。“一个举起……”和“一个应该……”?哪一个 warnings还是logging
Peter Lillevold

86

我同意另一个答案-logging用于日志记录和warning警告-但我想补充更多细节。

这是一个教程式的HOWTO,它指导您完成使用logging模块的步骤。 https://docs.python.org/3/howto/logging.html

它直接回答您的问题:

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

logging.warning()如果客户端应用程序无法对此情况做任何事情,但仍应注意该事件


60

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

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

发出的警告warnings.warn通常是有用的,但容易遗漏(特别是如果您在后台进程中运行Python程序而不捕获stderr)。因此,对它们进行记录可能会有所帮助。

Python提供了logging模块和warnings模块之间的内置集成,您可以执行此操作。只需logging.captureWarnings(True)在脚本开始处调用,warnings模块发出的所有警告将自动记录在级别WARNING


27

除了官方文档中规范解释

库代码中的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")
>>>

1
请注意,“仅显示一次”是预期的默认行为,但是警告过滤器可以更改此设置。
gerrit
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.