Python 3.14的t-strings与f-strings有何区别?能解决哪些新问题?
Python 3.14 t-strings与f-strings的差异及适用场景
核心差异
1. 求值时机与灵活性
- f-strings是编译时求值:代码编译阶段就会把占位符里的表达式计算并替换成结果,一旦编译完成,模板内容就固定了,没法在运行时修改模板结构。
示例:count = 3 msg = f"There are {count} items" # 编译后等价于 msg = "There are 3 items" - t-strings是运行时解析:模板的占位符替换逻辑在代码运行时才执行,支持动态加载模板内容(比如从文件、数据库读取),灵活性更高。
示例:count = 3 template = t"There are {count} items" # 运行时才会替换{count}为实际值
2. 功能定位与表达式支持
- f-strings主打内联表达式计算:可以在占位符里写任意Python表达式,比如算术运算、函数调用,适合需要直接计算结果的场景。
示例:print(f"2 squared is {2**2}") # 输出:2 squared is 4 - t-strings主打安全模板渲染:默认只支持变量替换,不执行任意表达式,同时支持占位符的高级配置(比如默认值、格式规则),适合处理模板化文本。
示例:username = None print(t"Welcome, {username:default='Guest'}") # 输出:Welcome, Guest
3. 安全性
- f-strings存在代码注入风险:如果模板内容来自不可信来源(比如用户输入),占位符里的恶意表达式会被执行,导致安全问题。
危险示例:user_input = "{os.system('echo malicious code')}" # 用f-string会执行命令 print(f"{user_input}") - t-strings默认无代码执行风险:即使模板包含恶意表达式,也只会当作普通字符串处理,不会执行,更适合处理外部输入的模板。
t-strings解决的新问题
- 安全处理不可信模板:之前用f-strings渲染用户提供的模板很容易触发代码注入,t-strings默认的安全机制避免了这个问题,不需要额外引入第三方模板库就能实现安全渲染。
- 简化默认值与格式配置:在f-strings里设置默认值需要写额外的条件表达式,t-strings直接在占位符里通过
:default='xxx'配置,语法更简洁直观。 - 支持动态模板修改:如果需要在运行时调整模板内容(比如根据不同场景加载不同模板),t-strings的运行时解析特性可以直接实现,而f-strings编译后无法修改模板结构。
- 内置轻量模板方案:之前Python内置的
string.Template功能有限,语法不够简洁,t-strings作为语法层面的支持,提供了更易用的内置模板能力,不需要依赖外部库就能处理大多数简单模板场景。
内容的提问来源于stack exchange,提问作者firebush
相关产品推荐
相关产品推荐

