Python 3.14 到手先试这三样:t-string、zstd 压缩与延迟注解

Python 3.14 到手先试这三样:t-string、zstd 压缩与延迟注解

背景:这是什么版本,值不值得升

Python 3.14 是 Python 语言的最新稳定版,于 2025 年 10 月 7 日发布。它的完整新特性清单很长,但对日常写脚本的人来说,真正能立刻用上的就几样:模板字符串(t-string)、内置 Zstandard 压缩、延迟求值注解,再加一个更顺手的交互解释器(REPL)高亮。

先说升级建议:写个人脚本、博客工具、VPS 上的小工具,可以升;生产服务先在测试环境跑一遍依赖再升,因为个别第三方扩展模块对新版本的适配有先后。本文所有示例都要求 Python 3.14,低版本运行 t-string 代码会直接报语法错误,所以先确认版本:

python3 --version

输出 Python 3.14.x 才继续。如果你的系统还是 3.12 或 3.13,先装好 3.14 再试,不要把 3.14 代码混进旧项目同一个文件里。

前置知识:会写基础 Python,会用命令行运行 .py 文件。不需要懂解释器内部原理。

第 1 样:t-string,把拼接和转义分开写

f-string 大家都熟:f"你好,{name}" 直接拼出字符串。t-string 长得很像,只是前缀换成 t,但它返回的不是字符串,而是一个 Template 对象,里面把“固定文本”和“插值部分”分开存着。好处是:处理代码可以在拼接之前先看到哪些部分是用户输入,从而决定怎么转义,而不是等拼成一整串之后再也分不清。

最直观的例子是做 HTML 转义。用户输入里如果有 <script>,直接拼进网页就是安全隐患;用 t-string 可以只转义插值部分,固定文本保持原样:

import html
from string.templatelib import Interpolation


def safe_html(template):
    parts = []
    for part in template:
        if isinstance(part, Interpolation):
            parts.append(html.escape(str(part.value)))
        else:
            parts.append(part)
    return "".join(parts)


name = "<b>访客</b>"
print(safe_html(t"<p>你好,{name}</p>"))

输出是 <p>你好,&lt;b&gt;访客&lt;/b&gt;</p>:标签被转义成普通文本,不会被浏览器当成 HTML 执行,而模板里自己写的 <p> 不受影响。以前用 f-string 实现同样的效果,要么全串转义(连自己的标签也坏掉),要么手写一堆占位符,容易漏。

记住一条界限:t-string 本身不自动保证安全,安全来自你写的处理函数——它只是把“哪些是用户输入”这个信息保留了下来。不要以为前面加个 t 就万事大吉。

第 2 样:内置 zstd,压日志不用再装第三方库

Zstandard(简称 zstd)是一种又快压缩率又不错的压缩格式,以前在 Python 里用它要另外装包。3.14 把它收进了标准库,模块名是 compression.zstd,用法和 lzma、bz2 很像。下面这个脚本可以拿来压 VPS 上的旧日志,压完立刻解压校验一次,确认无损再删原文件:

from compression import zstd
from pathlib import Path

src = Path("app.log")
data = src.read_bytes()

compressed = zstd.compress(data)
Path("app.log.zst").write_bytes(compressed)
print(f"原大小 {len(data)},压缩后 {len(compressed)}")

restored = zstd.decompress(Path("app.log.zst").read_bytes())
assert restored == data
print("解压校验通过,和原文件一致")

注意两点:一是压缩率取决于内容,本身已经压缩过的文件(图片、视频、zip 包)再压基本压不动,别指望它变小;二是校验那一步不要省,尤其是在你要删除原文件之前,先确认解压结果和原文件逐字节一致。

如果你之前用本博客的方法批量处理过图片,可以把这两篇结合起来看:图片走 WebP 压缩、日志文本走 zstd,工具链各管一摊。相关文章:Python 批量转 WebP 实战:透明图不发黑、大图先限宽、跑过一遍不再重复、Python 磁盘清理脚本:先列清单再删,删错可找回。

第 3 样:延迟注解,前向引用不用再套引号

写类的时候经常遇到“方法参数的类型就是这个类本身”,比如一棵树的节点引用另一棵树。以前要写成字符串 "Tree",否则定义方法时 Tree 这个名字还没创建完成,会报错。3.14 起注解默认延迟求值,不用再套引号:

class Tree:
    def add_child(self, child: Tree) -> None:
        print(f"添加子节点:{child}")

这只是写法变干净了,运行行为和以前加引号的版本一致。实际收益在两处:一是重构改名时不用再同步改字符串里的类型名;二是类型检查工具读到的注解更直接。如果你用的是旧版本,继续用引号写法,不要把这段代码直接粘过去。

顺手一试:REPL 自带语法高亮

在终端输入 python3 进入交互解释器,随便敲几行代码就能看到语法高亮和补全提示变好了。这不是大功能,但对调试小段代码、验证上面三个例子很有用:先在 REPL 里把 t-string 的 Template 结构打印出来看一眼,确认理解对了,再写进脚本。

升级清单:照着做,不踩坑

  1. 先跑 python3 --version,确认是 3.14 再试本文代码。
  2. t-string 示例单独存一个文件,别混进还要兼容旧版本的项目。
  3. zstd 压文件前先备份,解压校验通过后再删原文件。
  4. 生产项目升级前,先在测试环境装好依赖跑一遍测试,确认第三方包都已适配。
  5. 想看完整清单,再读官方文档:Python 3.14 有什么新变化。

一句话总结:3.14 不是“性能翻倍”那种大版本,但 t-string、zstd、延迟注解这三样,都是写脚本时每周都会碰到的顺手改进,值得花一个下午升级并试一遍。