【发布时间】:2019-01-31 09:54:44
【问题描述】:
这两个调用有什么区别:
import logging
logging.getLogger().debug('test: %i' % 42)
和
logging.getLogger().debug('test: {}'.format(42))
我们假设42 被转换为产生最终答案为 42 的字符串时,会被一些长时间的计算(比如 750 万年的计算)所取代。
如果日志记录设置为调试,第一种方法是否会延迟评估?
【问题讨论】:
-
检查:stackoverflow.com/questions/40714555/…,为了性能,可能会想要比这些方法更快的
f-strings,检查:stackoverflow.com/questions/43123408/f-strings-in-python-3-6 -
超级有用的参考资料,感谢RafaelC,虽然它没有澄清懒惰的评估问题。
-
在您的两个示例中,格式化的字符串在
logging模块完全参与该过程之前由 Python 完全评估。您可能希望将格式字符串及其参数作为 单独的参数 传递给.debug(),以便它实际进行格式化 - 我假设它仅在消息不会出现时才这样做过滤掉了,但我不能 100% 确定这一点。 -
如果你真的想要懒惰,你需要像
if logging.getLogger().isEnabledFor(logging.DEBUG): …这样的东西。但是,从您的 cmets 的答案来看,听起来您不需要那个。 -
也许见stackoverflow.com/q/4148790/2864740。解决方案还显示了一个代理对象来推迟价值生成的成本。当然,生成调试值仍然应该“相对快速”和“无副作用”,否则启用调试的行为仍然会出现问题/出乎意料..