4

可以像这样混合普通字符串和新的 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 字符串的最佳实践?

4

1 回答 1

2

这里没有意见的问题是“编译时连接”格式化的字符串“文字”是什么意思,它们是真正的运行时表达式?语言参考只是说你可以

实验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",但我当然可以设想后者更可取的情况。只要您愿意在人们对语义有疑问时向他们指出这个问题,我会说这足以使半意见回答“是的,没关系”。

于 2019-12-19T04:18:54.127 回答