为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2021-11-16 14:54:21
可以像这样混合普通字符串和新的 f-string 吗:import timeitformat = """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.41889029399953873.3931472289996236这可以使用吗,或者混合普通弦和 f 弦不被认为是最佳做法?
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

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

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


查看完整回答
反对 回复 2021-11-16
  • 1 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信