一、一个字符串引发的血案
去年,某互联网大厂的工程师小李接到了一个安全审计的工单。
原因是他写的一段代码:
user_input = " <> alert('xss') " html = f"
{user_input}
" print(html) # 输出:
<> alert('xss')
f-string 直接把恶意脚本原样塞进了 HTML。
这不是小李一个人的问题。在 Python 开发中,SQL 注入、XSS 攻击、日志注入……无数安全漏洞的根源,都可以追溯到字符串拼接时的「盲目信任」。
f-string 很方便,但它有一个致命缺陷:
**它在格式化的一瞬间,就把所有值强制转成了字符串,完全丢失了原始类型和上下文信息。**
你没法告诉 f-string:「这个值要转义后再插入」「这个值要作为 JSON 字段处理」「这个值是敏感信息,请打码」。
而今天,Python 3.14 带来了一个可能改变一切的答案:
t-string(模板字符串)。
---
二、t-string 是什么?
t-string 是 Python 3.14 引入的全新字符串类型,由 PEP 750 提案定义。它的语法和 f-string 几乎一模一样,只是把前缀从 `f` 换成了 `t`:
name = "World" template = t"Hello, {name}!"
但关键的区别在于:
f-string 返回的是已经格式化好的 `str`,而 t-string 返回的是一个 `Template` 对象。
这个 `Template` 对象内部保存了:
·字符串的静态片段(如 `"Hello, "` 和 `"!"`)
·每一个插值表达式的原始值和代码位置
换句话说,t-string 把「格式化」和「渲染」分成了两步。
from string.templatelib import Template name = "World" template = t"Hello, {name}!" print(type(template))#print(template)# Hello, World!
这看起来差别不大,但正是这个设计,让 t-string 拥有了 f-string 永远无法具备的能力。
---
三、四大核心场景实战
场景一:安全 HTML 渲染(自动转义)
这是 t-string 最经典的用例。我们可以定义一个 `html()` 函数,自动对插入的值进行 HTML 转义:
from string.templatelib import Template from html import escape def html(template: Template) -> str: """将模板渲染为安全 HTML,自动转义所有插值""" parts = [] for item in template: match item: case str(): parts.append(item) case _: parts.append(escape(str(item.value))) return "".join(parts) # 测试 user_input = " <> alert('xss') " result = html(t"
{user_input}
") print(result) # 输出:
<script>alert('xss')</script>
恶意脚本被安全转义了!而且代码非常优雅——你只需要把 `f` 换成 `t`,再包一层 `html()`。
更妙的是,如果插值本身已经是「安全的 HTML」,你可以定义一个标记类来跳过转义: