可以像这样混合普通字符串和新的 f-string 吗:
import timeit
format = """
def format(name, age):
return (
f'He said his name is '
f'{name} and he is '
f'{age} years old.'
)
""", """
def format(name, age):
return (
'He said his name is '
f'{name} and he is '
f'{age} years old.'
)
"""
test = """
def test():
for name in ('Fred', 'Barney', 'Gary', 'Rock', 'Perry', 'Jackie'):
for age in range (20, 200):
format(name, age)
"""
for fmt in format:
print(timeit.timeit('test()', fmt + test, number=10000))
[out]:
3.4188902939995387
3.3931472289996236
这可以使用吗,或者混合普通弦和 f 弦不被认为是最佳做法?
最佳答案
这里没有意见的问题是它是什么平均值 到“编译时连接”格式化字符串“文字”真正是运行时表达式?语言引用仅says that you can .
实验 dis
表明即使是一个单独的 f 字符串也被分解为间隙字符串文字和格式化表达式(编译为新的 FORMAT_VALUE
操作码,而不是变成对 str.format
左右的调用)。每个 f 字符串都以这种方式处理 单独 (在串联之前,所以 f"{x" f"}"
是无效的)。由这种分解产生的前缀和后缀字符串文字(如果有)然后与相邻的普通字符串文字(或由相邻 f 字符串产生的字符串文字)连接。最后,同样新的 BUILD_STRING
操作码用于有效地连接片段。请注意,这意味着您的两个 format
函数编译为 相同 字节码和任何时间差异只是噪音。
从这个(实现者)的角度来看,规则是显而易见的;从用户的角度来看,格式化发生,直观地,只在 f"…"
内部发生。 .是否写是一个品味问题f"v={{{x},{y}}}\n"
或 "v={" f"{x},{y}" "}\n"
,但我当然可以想到后者更可取的情况。如果人们对语义有疑问,只要你愿意指出这个问题,我会说这足以使 半意见回答“是的,没关系”。
关于python - 在行延续中混合普通字符串和 f 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54823506/