格式说明符中的嵌套 f 字符串与评估表达式
这个问题是关于在“外部”f-string 的某些评估表达式中使用 f-string 的用例。
这与允许评估表达式出现在f 字符串的格式说明符中的功能不同。后一个功能非常有用,并且与这个问题有些相关,因为(1)它涉及嵌套的花括号,所以这可能是人们查看这篇文章的原因,以及(2)格式说明符中允许嵌套的 f 字符串,就像它们一样在 f 字符串的其他卷曲表达式中。
F弦嵌套可以帮助单行
虽然肯定不是允许嵌套 f 字符串的动机,但嵌套可能有助于在您需要或想要“单线”的模糊情况下(例如 lambda 表达式、理解、python -c
来自终端的命令)。例如:
print('\n'.join([f"length of {x/3:g}{'.'*(11 - len(f'{x/3:g}'))}{len(f'{x/3:g}')}" for x in range(10)]))
如果您不需要单行,则可以通过预先定义一个变量然后在 f 字符串的评估表达式中使用变量名称来替换任何语法嵌套(在许多情况下,如果不是大多数情况下,非嵌套版本可能更具可读性和更易于维护;但是它确实需要提供变量名):
for x in range(10):
to_show = f"{x/3:g}"
string_length = len(to_show)
padding = '.' * (11 - string_length)
print(f"length of {to_show}{padding}{string_length}")
嵌套的评估表达式(即在格式说明符中)很有用
与真正的 f 字符串嵌套相比,允许在 f 字符串的“格式说明符”内评估表达式的相关功能可能非常有用(正如其他人指出的那样),原因包括:
- 格式可以在多个 f 字符串或评估表达式之间共享
- 格式可以包括计算数量,这些数量可能因运行而异
这是一个使用嵌套求值表达式但不使用嵌套 f 字符串的示例:
import random
results = [[i, *[random.random()] * 3] for i in range(10)]
format = "2.2f"
print("category,precision,recall,f1")
for cat, precision, recall, f1 in results:
print(f"{cat},{precision:{format}},{recall:{format}},{f1:{format}}")
然而,即使是这种嵌套的使用也可以用不需要语法嵌套的更灵活(也许更简洁)的代码来代替:
import random
results = [[i, *[random.random()] * 3] for i in range(10)]
def format(x):
return f"{x:2.2f}"
print("category,precision,recall,f1")
for cat, precision, recall, f1 in results:
print(f"{cat},{format(precision)},{format(recall)},{format(f1)}")