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

可以像这样混合普通字符串和新的 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 弦不被认为是最佳做法?


守着一只汪
浏览 185回答 1
1回答

呼啦一阵风

这里没有意见的问题是“编译时连接”真正是运行时表达式的格式化字符串“文字”是什么意思?语言参考只是说你可以。实验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",但我当然可以想到后者更可取的情况。只要你愿意在人们对语义有疑问时指出这个问题,我会说这足以让半意见回答“是的,没关系”。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python