Python 3.15.0 beta 2 已经出炉,这是正式发布前的倒数第三个 beta 版本。beta 阶段意味着不再接受新特性(feature freeze 已过),后续版本只会修 bug 和做小调整。如果你有库或项目需要兼容 3.15,现在就是最佳验证窗口——等到 release candidate 再测,留给修问题的时间就很短了。
为什么 beta 2 值得关注
Python 的年度发布节奏已经稳定:每年一个新版本。3.15 的开发周期遵循同样的时间表——alpha 阶段合入新特性,beta 阶段冻结特性只修缺陷,然后进入 release candidate,最终正式发布。
"倒数第三个 beta"这个定位意味着:
- 特性集已锁定:你看到的 API 和行为,基本就是最终版的样子。
- 还有调整空间:如果某个改动让你的项目崩溃,现在报告还有时间被采纳。
- CI 可以开始跑了:把 3.15 beta 加入持续集成矩阵,提前暴露问题。
3.15 中的关键变化
基于已合入的特性,以下几项值得重点留意:
自由线程模式(free-threaded build)继续成熟
3.13 引入了实验性的 free-threaded 构建(去掉 GIL),3.14 做了大量扩展模块适配工作,3.15 在这条路上继续推进。如果你的 C 扩展还没测试过 free-threaded 模式,现在该动手了。
标准库与语法层面的调整
每个版本都有一些标准库改动和废弃声明。3.15 继续清理历史遗留——部分在之前版本标记为 deprecated 的 API 可能正式移除。如果你的代码依赖这些,升级后会直接报错。
性能与内部优化
Python 团队持续在解释器性能上投入,3.15 包含一系列底层优化。对大多数开发者来说不需要改代码,但基准测试数字会好看一些。
实践:安装 beta 2 并跑兼容性测试
下面是一个可以直接复制使用的流程,从安装到跑测试:
# 用 pyenv 安装 Python 3.15.0b2(需要先更新 pyenv 的定义)
pyenv update
pyenv install 3.15.0b2
# 设置为某个项目的本地版本
cd ~/my-project
pyenv local 3.15.0b2
# 确认版本
python --version
# 应输出: Python 3.15.0b2
如果你不用 pyenv,也可以直接从 python.org 下载预编译包,或者用 conda:
conda create -n py315b2 python=3.15.0b2 -c conda-forge
conda activate py315b2
安装完成后,跑一遍你的测试套件:
# 安装项目依赖(可能需要处理兼容问题)
pip install -e ".[dev]"
# 跑完整测试
pytest --tb=short -q
# 如果有 C 扩展,尝试 free-threaded 构建
# 需要单独安装 free-threaded 版本的 Python 3.15
# 然后重新编译你的 C 扩展并测试
下面是一个简单的兼容性检查脚本,可以快速扫描代码中是否使用了已知被移除的 API:
"""quick_compat_check.py — 扫描项目源码中的潜在兼容问题"""
import ast
import sys
from pathlib import Path
# 3.15 中可能移除或变更的 API(根据各版本 deprecated 路径整理)
# 这里列出一些常见的,实际列表需参考官方 "What's New"
FLAGGED_IMPORTS = {
# 示例:某些旧模块在后续版本移除
# "asyncore": "3.12 已 deprecated,后续版本移除",
# "imp": "3.4 已 deprecated,使用 importlib",
}
FLAGGED_ATTRS = {
# 示例属性访问
# ("sys", "setrecursionlimit"): "注意 free-threaded 下行为可能不同",
}
def scan_file(filepath: Path) -> list[str]:
"""解析单个 Python 文件,返回发现的警告列表"""
warnings = []
try:
tree = ast.parse(filepath.read_text(encoding="utf-8"))
except SyntaxError:
return warnings
for node in ast.walk(tree):
if isinstance(node, ast.Import):
for alias in node.names:
if alias.name in FLAGGED_IMPORTS:
warnings.append(
f"{filepath}:{node.lineno} — "
f"import {alias.name}: {FLAGGED_IMPORTS[alias.name]}"
)
elif isinstance(node, ast.ImportFrom):
if node.module in FLAGGED_IMPORTS:
warnings.append(
f"{filepath}:{node.lineno} — "
f"from {node.module}: {FLAGGED_IMPORTS[node.module]}"
)
for alias in node.names:
key = (node.module or "", alias.name)
if key in FLAGGED_ATTRS:
warnings.append(
f"{filepath}:{node.lineno} — "
f"{node.module}.{alias.name}: {FLAGGED_ATTRS[key]}"
)
return warnings
def main():
src_dir = Path(sys.argv[1] if len(sys.argv) > 1 else ".")
all_warnings = []
for py_file in src_dir.rglob("*.py"):
all_warnings.extend(scan_file(py_file))
if all_warnings:
print(f"⚠ 发现 {len(all_warnings)} 个潜在兼容问题:")
for w in all_warnings:
print(w)
else:
print("✅ 未扫描到已知废弃 API 的使用")
if __name__ == "__main__":
main()
运行方式:
python quick_compat_check.py ./src
注意:上面的
FLAGGED_IMPORTS和FLAGGED_ATTRS是示例结构。实际扫描时,你需要根据 Python 3.15 官方 "What's New in Python 3.15" 文档填充具体的废弃/移除列表。beta 阶段这份文档会持续更新。
给库维护者的建议
如果你维护一个被他人依赖的 Python 库,现在就该做这几件事:
| 步骤 | 动作 | 时间窗口 |
|---|---|---|
| 1 | 在 CI 中加入 3.15 beta 测试 | 现在 |
| 2 | 修复发现的兼容问题 | beta 期间 |
| 3 | 发布兼容版本(可标记 python_requires>=3.9 等) |
正式发布前 |
| 4 | 测试 free-threaded 模式(如有 C 扩展) | 尽早 |
几个实操要点:
- CI 配置:在 GitHub Actions 中加入
3.15.0-beta.2到python-version矩阵。beta 版本号格式可能需要查 actions/setup-python 的最新版本列表。 - 允许失败但可见:初期可以设置
continue-on-error: true,但要让失败结果出现在 PR 检查里,别静默吞掉。 - C 扩展必须测 free-threaded:用 free-threaded 构建重新编译,跑多线程测试。这是 3.15 最大的底层变化,不测就是在赌。
写在最后
Python 3.15 beta 2 不是"看看就好"的版本——它是你确认项目兼容性的最佳时机。特性已经冻结,行为基本定型,但还有时间反馈问题。花一两个小时把 CI 矩阵扩展一下,跑一遍测试,远比正式发布后紧急修补划算。
如果你是终端用户而非库维护者,同样值得装上 beta 2 跑跑自己的脚本和工作流,尤其是涉及多线程的场景——free-threaded 模式带来的行为差异可能比你预期的大。
下一个里程碑是 beta 3,之后是 beta 4,然后进入 release candidate。时间不多了。