Python 2026 年 9 月动态:异步生成器获得 yield from,3.15 ABI 冻结与 AI 依赖升级

2026-09-07 32 预计阅读时间: 1 分钟
来源: realpython.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:7 分钟

2026 年 9 月的 Python 动态同时影响语言使用者、扩展维护者和 AI 应用团队:PEP 828 将 yield from 的委托能力带给异步生成器,Python 3.15 冻结 ABI,而四个 AI 库在十天内发布了不兼容版本。这三件事看似分散,实际上都在提醒工程团队重新检查抽象边界和升级策略。

异步生成器终于能表达“流的委托”

同步生成器早已可以通过 yield from 把迭代工作交给另一个生成器。异步生成器此前通常需要手写 async for,逐项转发数据:

import asyncio
from collections.abc import AsyncIterator

async def page_one() -> AsyncIterator[str]:
    for value in ("alpha", "beta"):
        await asyncio.sleep(0.01)
        yield value

async def page_two() -> AsyncIterator[str]:
    for value in ("gamma", "delta"):
        await asyncio.sleep(0.01)
        yield value

async def merged_stream() -> AsyncIterator[str]:
    # 兼容当前 Python 的显式委托写法
    async for value in page_one():
        yield value
    async for value in page_two():
        yield value

async def main() -> None:
    print([value async for value in merged_stream()])

if __name__ == "__main__":
    asyncio.run(main())

直接运行:

python async_stream.py

预期输出为:

['alpha', 'beta', 'gamma', 'delta']

PEP 828 的意义不只是少写几行循环。委托语法可以更明确地表示“当前生成器把产出职责交给下游异步生成器”,适合分页 API、流式响应、事件管道和分段文件读取等场景。

在支持 PEP 828 的 Python 版本中,可以把上面的显式转发改造成类似下面的形式。这里是基于该提案目标的迁移示意,实际采用前应以目标 Python 版本的最终语法和文档为准:

async def merged_stream():
    yield from page_one()
    yield from page_two()

迁移时不要只检查输出值。异步委托还涉及取消、异常传播、生成器关闭和资源清理。数据库游标、网络连接或文件句柄尤其需要测试消费者提前退出的情况。

Python 3.15 ABI 冻结意味着什么

ABI 冻结对普通纯 Python 项目通常没有直接影响,但对维护 C/C++、Rust 等原生扩展的团队很重要。ABI 进入冻结状态后,扩展作者可以围绕稳定下来的二进制接口开展构建、兼容性测试和 wheel 发布准备,降低临近正式版时再次适配接口变化的风险。

不过,“ABI 已冻结”不等于“所有扩展已经兼容”。项目仍然需要验证编译器、平台标签、第三方构建后端以及运行时行为。可以在隔离环境中建立一条预发布测试通道:

python3.15 -m venv .venv315
. .venv315/bin/activate
python -m pip install --upgrade pip build pytest
python -m pip install --pre -e .
pytest -q
python -m build

Windows PowerShell 中的激活命令应替换为:

.venv315\Scripts\Activate.ps1

如果项目发布二进制 wheel,还应在支持的平台矩阵中分别检查安装结果,而不是只验证源码安装。包含原生扩展的项目可以将 Python 3.15 加入 CI 的允许失败任务,等依赖链准备完成后再提升为强制检查。

十天四次破坏性发布暴露了 AI 依赖风险

四个 AI 库在十天内发布不兼容版本,问题不只是更新频率高。AI 应用往往同时依赖模型 SDK、编排框架、向量数据库客户端和可观测性组件;其中任何一层更改消息结构、工具调用格式、重试策略或异步接口,都可能让故障出现在运行时,而不是安装阶段。

一个可操作的做法是把直接依赖与解析后的锁定版本分开管理。以下示例使用 pip-tools,其中包名和版本只是项目模板,需要替换为团队实际使用的依赖:

# requirements.in
model-sdk>=2,<3
agent-framework>=1.8,<2
vector-client>=4,<5
observability-sdk>=3,<4
python -m pip install pip-tools
pip-compile --generate-hashes requirements.in
python -m pip-sync requirements.txt
python -m pip check
pytest -q

不要把四个破坏性升级合并成一个无法定位问题的大变更。更稳妥的节奏是逐个更新锁文件,并为每次升级运行相同的契约测试。AI 服务至少应覆盖以下行为:

  • 流式与非流式响应都能被解析。
  • 工具调用参数和返回值保持预期结构。
  • 超时、限流和重试不会重复执行有副作用的操作。
  • 异步客户端能在取消后释放连接。
  • 模型响应字段缺失或新增时,业务代码能够明确失败或兼容处理。

团队现在可以采取的升级顺序

语言新能力和生态破坏性更新不应进入同一个发布批次。建议先在现有 Python 版本上锁定 AI 依赖并补齐契约测试,再单独建立 Python 3.15 测试矩阵,最后评估是否用 PEP 828 简化异步流代码。

采用前可以检查四项:目标运行时是否已经正式支持相关语法;原生扩展是否提供对应 wheel;异步生成器的取消与清理测试是否齐全;AI 依赖是否按单库、单变更集升级。yield from 会让异步代码更简洁,但真正决定升级质量的,仍然是隔离变更、锁定依赖和验证边界行为。


相关推荐