嵌套f-strings与格式说明符中的求值表达式
这个问题是关于使用f-string在“外部”f-string的某个求值表达式内部的用例。
这与允许在f-string的格式说明符中出现求值表达式的特性不同。后者非常有用,与此问题有些相关,因为(1)它涉及嵌套花括号,所以人们可能会看这篇文章,(2)嵌套f-strings在格式说明符中与它们在f-string的其他花括号表达式中一样被允许。
F-string嵌套可以帮助简化代码
虽然肯定不是允许嵌套f-strings的主要动机,但在需要或想要“一行代码”的晦涩情况下可能会有所帮助(例如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-string的评估表达式中使用变量名来替换(在许多情况下,非嵌套版本可能更易读且更易于维护; 但是这需要想出变量名):
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-string嵌套相比,允许在f-string的“格式说明符”中使用计算表达式的相关特性非常有用(正如其他人指出的那样),原因包括:
- 格式化可以在多个f-string或计算表达式之间共享
- 格式化可以包括可以在每次运行时变化的计算数量
这里是一个使用嵌套计算表达式而不是嵌套f-string的示例:
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)}")
str.format
相同的目的:https://dev59.com/L5vga4cB1Zd3GeqP9fB4 - TigerhawkT3print("\n".join(f'{a:{a}<{a}}' for a in range(1,10)))
。 - Bhargav Raof'''已设置计时器为{f"{hrs:02d}:{mins:02d}:{secs:02d}" if hrs > 0 else f"{f'{mins:02d}:{secs:02d}' if mins > 0 else f'{secs}秒'}"}!'''
- kr8gz