如何让Python将格式化字符串作为常量求值?解析拼接差异
Python中能否将格式化字符串预求值为常量?
先看示例代码:
def foo(): A = 'something' + ' ' + 'good' B = 'is' C = f'{B} going on' return A + C print(foo.__code__.co_consts) # 输出:(None, 'something good', 'is', ' going on')
能不能让Python把格式化字符串求值为常量?
默认情况下不行,但可以借助第三方编译期优化工具(比如用ast模块自定义改写代码,或是类似Cython的静态编译工具)实现,但标准CPython解释器的字节码编译器不会自动做这件事。
为什么字符串拼接能被优化成常量,f-string却不行?
- 字符串拼接的所有操作数都是编译期常量:
'something'、' '、'good'都是固定字面量,Python编译器在编译函数时可以直接算出拼接结果'something good',并把它存入co_consts。 - f-string的插值依赖运行时变量:哪怕
B在代码里赋值为固定的'is',它本质是函数内的局部变量,编译器无法确保运行时它的值不会被修改(比如后续对B重新赋值、或是通过其他方式改动),所以只能在运行时才会把B的值和' going on'拼接,编译期没法提前算出完整的'is going on',因此co_consts里只有拆分后的部分。
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

