可以像这样混合普通字符串和新的 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"
,但我当然可以想到后者更可取的情况。只要你愿意在人们对语义有疑问时指出这个问题,我会说这足以让半意见回答“是的,没关系”。
添加回答
举报
0/150
提交
取消