代码之家  ›  专栏  ›  技术社区  ›  Edward Falk

你能覆盖f字符串的默认格式化程序吗?

  •  1
  • Edward Falk  · 技术社区  · 4 月前

    通读 PEP 3101 ,它讨论了如何子类化string.Formatter来定义自己的格式,但随后您可以通过以下方式使用它 myformatter.format(string) 。有没有一种方法可以让它与f字符串一起工作?

    例如,我想做这样的事情 f"height = {height:.2f}" 但我想要自己的浮点格式化程序来处理某些特殊情况。

    1 回复  |  直到 4 月前
        1
  •  1
  •   Bhargav    4 月前

    正如我在注释中提到的,F字符串实际上是在编译时处理的,而不是在运行时处理的。您无法覆盖默认的f-string格式化程序,这是由于Python在基本级别上实现了f-string。

    例如,如果你跑步

    f"height = {height:.2f}"
    

    它有效地转换

    "height = {}".format(format(height, '.2f'))
    

    转换发生在编译过程中,无法在运行时“挂钩”或修改此过程。

    你能做的就是。

    使用 decimal 精密控制模块。

    参考资料- https://realpython.com/how-to-python-f-string-format-float/

    from decimal import Decimal
    
    value = Decimal('1.23456789')
    print(f"Value: {value:.2f}")
    

    输出:

    Value: 1.23
    

    Decimal实现了 格式 方法并处理标准格式说明符,如.2f。

    旁注:

    我们并没有真正“覆盖”这里的默认格式化程序——它正在实现现有的格式规范协议。

    由于您的目标是处理浮点格式化的特殊情况,因此使用Decimal可以解决您的问题。。。