嵌套的 f 弦

新手上路,请多包涵

感谢 David Beazley 的推文,我最近发现新的 Python 3.6 f-strings 也可以嵌套:

 >>> price = 478.23
>>> f"{f'${price:0.2f}':*>20s}"
'*************$478.23'

或者:

 >>> x = 42
>>> f'''-{f"""*{f"+{f'.{x}.'}+"}*"""}-'''
'-*+.42.+*-'

虽然我很惊讶这是可能的,但我不知道它有多实用,什么时候嵌套 f 弦会有用?这可以涵盖哪些用例?

注意:PEP 本身并没有提到嵌套 f 字符串,但是有一个 特定的测试用例

原文由 alecxe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 704
2 个回答

我不认为允许嵌套的格式化字符串文字(通过嵌套,我认为它的意思是 f'{f".."}' )是仔细考虑可能的用例的结果,我更相信它只是为了它们而被允许以符合他们的规范。

规范声明它们 支持括号内的完整 Python 表达式*。它还指出,格式化字符串文字 _实际上只是一个在运行时计算的表达式_(参见 此处此处)。因此,只有允许格式化字符串文字作为另一个格式化字符串文字中的表达式才有意义,禁止它会否定对 Python 表达式的完全支持。

您找不到文档中提到的用例(并且只能在测试套件中找到测试用例)的事实是因为这可能是实现的一个很好的(副作用)效果,而不是激励用例。


实际上,有两个例外:不允许空表达式,lambda 表达式必须用显式括号括起来。

原文由 Dimitris Fasarakis Hilliard 发布,翻译遵循 CC BY-SA 4.0 许可协议

我猜这是为了在同一行中传递格式化参数,从而简化 f-strings 的 使用。

例如:

 >>> import decimal
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"
'result:      12.35'

当然,它允许程序员编写绝对不可读的代码,但这不是目的:)

原文由 Eugene Lisitsky 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题