问题描述
对于以下代码:
logger.debug('message: {}'.format('test'))
pylint
产生以下警告:
记录格式插值 (W1202):
在日志记录函数中使用 % 格式并将 % 参数传递为参数 当日志语句的调用形式为记录.(format_string.format(format_args ...))".这样的调用应改用 % 格式,但将插值留给通过将参数作为参数传递来记录函数.
Use % formatting in logging functions and pass the % parameters as arguments Used when a logging statement has a call form of "logging.(format_string.format(format_args...))". Such calls should use % formatting instead, but leave interpolation to the logging function by passing the parameters as arguments.
我知道我可以关闭此警告,但我想了解它.我假设使用 format()
是在 Python 3 中打印语句的首选方式.为什么对于 logger 语句不适用?
I know I can turn off this warning, but I'd like to understand it. I assumed using format()
is the preferred way to print out statements in Python 3. Why is this not true for logger statements?
推荐答案
logger 语句不是这样,因为它依赖于以前的 "%" 格式(如字符串),使用给予 logger 调用的额外参数来提供此字符串的惰性插值.例如,不要这样做:
It is not true for logger statement because it relies on former "%" format like string to provide lazy interpolation of this string using extra arguments given to the logger call. For instance instead of doing:
logger.error('oops caused by %s' % exc)
你应该这样做
logger.error('oops caused by %s', exc)
所以只有在实际发出消息时才会对字符串进行插值.
so the string will only be interpolated if the message is actually emitted.
使用 .format()
时,您无法享受此功能.
You can't benefit of this functionality when using .format()
.
根据 logging
文档的 优化 部分:
Per the Optimization section of the logging
docs:
消息参数的格式被推迟到无法避免为止.但是,计算传递给 logging 方法的参数也可能很昂贵,如果 logger 只是丢弃您的事件,您可能希望避免这样做.
这篇关于PyLint 消息:记录格式插值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!