繁体   English   中英

如何使用 % 格式从变量中指定浮点精度?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM