在行继续中混合普通字符串和 f 字符串

Mixing normal string with f-string in line continuation

像这样混合普通字符串和新 f 字符串是否可以:

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-string 都以这种方式 separately 处理(在连接之前,因此 f"{x" f"}" 无效)。 result 的前缀和后缀字符串文字(如果有的话)然后与相邻的普通字符串文字(或由相邻的 f 字符串生成的文字)连接。最后,同样新的 BUILD_STRING 操作码用于有效地连接片段。请注意,这意味着您的两个 format 函数编译为 相同的 字节码,任何时间差异都只是噪音。

从这个(实施者)的角度来看,规则是显而易见的;从用户的角度来看,格式化直观地发生在 f"…" 内部。写 f"v={{{x},{y}}}\n" 还是 "v={" f"{x},{y}" "}\n" 是个人喜好问题,但我当然可以想到后者更可取的情况。只要你愿意在人们对语义有疑问的情况下向他们指出这个问题,我会说这足以让 半意见 回答“是的,没关系” .