[英]How to specify float precision from variable in logging using % formatting?
我想避免在日志记录中急切地评估 f 字符串,因此我使用 %-formatting。
精度由变量precision
定义。
import logging
value = 3.14159
logging.error("%.2f", value)
precision = 2
logging.error(f"{value:.{precision}f}") # OK but eager evaluation
logging.error("%.*f", value, precision) # fails
logging.error("%.%if", value, precision) # fails
有什么建议吗?
logging.error("%.*f", value, precision) # fails
几乎是正确的,但精度必须是第一位的:
logging.error("%.*f", precision, value) # works
助记符:精度的占位符*
在float
值的占位符f
之前,因此在float
之前提供精度。
遗憾的是,虽然助记符适用于其他格式化工具,但它适用于每个占位符的开头,而不是结尾。 例如,在str.format
中,占位符的自动编号基于每个占位符的大括号{
的顺序,因此对于这种情况,您可以这样做:
'{:.{}f}'.format(value, precision)
因为value
的占位符的左大括号位于精度的左大括号占位符之前。 当然,在这种情况下,您可以通过明确和编号来避免歧义:
'{0:.{1}f}'.format(value, precision)
或命名它们:
'{value:.{precision}f}'.format(precision=precision, value=value) # Order of kwargs irrelevant
当然,使用 f 字符串,您可以内联每个地方使用的名称,因此不存在混淆:
f'{value:.{precision}f}'
它比现代 Python 中的任何其他字符串格式化方式都快,所以对于任何可能在正常使用中实际发出的日志,我都会坚持使用 f 字符串。 即使对于那些不会发出的日志,记录低于日志级别(并且不会发出)的内容的开销也足够高,以至于避免临时str
所节省的成本在上下文中非常小,并且风险除非日志记录足够高,否则不会注意到的错误,我通常会使用急切的格式化,尤其是对于像这样的更复杂的情况。 我肯定被以下形式的代码所困扰:
logging.debug('%s %s', a, b, c)
代码是无条件执行的,但从未启用DEBUG
级别的日志记录; 我第一次需要它来解决问题时,由于占位符计数不匹配,代码中断了。 急切的格式不可能出现类似的问题,无论是现代 f 字符串还是不太现代的str.format
甚至急切printf
格式,如logging.debug('%s %s' % (a, b, c))
; 即使完全关闭日志记录,您也会看到错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.