PyLint 消息:日志格式插值

新手上路,请多包涵

对于以下代码:

 logger.debug('message: {}'.format('test'))

pylint 产生以下警告:

日志记录格式插值 (W1202):

在日志函数中使用 % 格式化并将 % 参数作为参数传递 当日志语句具有“logging.(format_string.format(format_args…))”的调用形式时使用。此类调用应改用 % 格式,但通过将参数作为参数传递给日志记录函数保留插值。

我知道我可以关闭此警告,但我想了解它。我假设使用 format() 是在 Python 3 中打印语句的首选方法。为什么这对于记录器语句不正确?

原文由 pfnuesel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

logger 语句不是这样,因为它依赖于以前的“%”格式,如字符串,使用提供给 logger 调用的额外参数来提供此字符串的惰性插值。例如,而不是做:

 logger.error('oops caused by %s' % exc)

你应该做

logger.error('oops caused by %s', exc)

因此只有在消息实际发出时才会插入字符串。

使用 .format() 时,您无法利用此功能。


根据 logging 文档的 优化 部分:

消息参数的格式化被推迟,直到它无法避免。但是,计算传递给记录方法的参数也可能很昂贵,如果记录器会丢弃您的事件,您可能希望避免这样做。

原文由 sthenault 发布,翻译遵循 CC BY-SA 3.0 许可协议

也许这次 时间差异 可以帮助你。

以下描述不是您问题的答案,但可以帮助人们。

如果要使用 fstrings(文字字符串插值)进行日志记录,则可以使用 disable=logging-fstring-interpolation.pylintrc 文件禁用它,请参阅: 相关问题和评论

您也可以禁用 logging-format-interpolation


对于 pylint 2.4:

.pylintrc 中有3种选项,可用于记录样式, - - fstr - file: old new

fstr 选项在 2.4 中添加并在 2.5删除

来自 .pylintrc 文件 (v2.4) 的描述:

 [LOGGING]

# Format style used to check logging format string. `old` means using %
# formatting, `new` is for `{}` formatting,and `fstr` is for f-strings.
logging-format-style=old

对于 旧的logging-format-style=old ):

 foo = "bar"
self.logger.info("foo: %s", foo)

对于 的( logging-format-style=new ):

 foo = "bar"
self.logger.info("foo: {}", foo)
# OR
self.logger.info("foo: {foo}", foo=foo)

注意:您 不能 使用 .format() 即使您选择 new 选项。

pylint 仍然对此代码给出相同的 警告

 self.logger.info("foo: {}".format(foo))  # W1202
# OR
self.logger.info("foo: {foo}".format(foo=foo))  # W1202

对于 fstrlogging-format-style=fstr ):

 foo = "bar"
self.logger.info(f"foo: {foo}")

就个人而言,我更喜欢 fstr 选项,因为 PEP-0498

原文由 mustafagok 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题