Python 3.14 标准库教程 — 版本背景与模块可用性#
一句话摘要:本教程覆盖的六个模块"年龄"差异很大——
contextlib长期存在、dataclasses/contextvars于 3.7 引入、traceback关键 API 于 3.4/3.5 引入、sys.monitoring于 3.12 引入、annotationlib为 3.14 全新模块;在动手前先确认所用 Python 版本,能避免绝大多数ImportError/AttributeError。
一、六模块的版本可用性对比#
模块 |
引入版本 |
规范/动机 |
在 3.14 的关键变化 |
|---|---|---|---|
|
长期存在(多数 API 在 3.2–3.11 陆续加入) |
围绕 |
官方文档未标注 3.14 新增 API;在 3.14 中可与新特性(如 |
|
3.7 |
① |
|
|
3.12 |
新增 |
|
|
3.14 新增 |
整个模块即为 3.14 新增能力 |
|
|
3.7 |
|
|
|
早期即存在(关键 API 于 3.4/3.5 陆续加入) |
栈回溯的标准化提取/格式化/打印 |
|
补充说明(均源自各章节的版本信息):
contextlib中各 API 并非同时出现:ContextDecorator为 3.2,ExitStack为 3.3,suppress/redirect_stdout为 3.4,redirect_stderr为 3.5,AbstractContextManager为 3.6,@asynccontextmanager/nullcontext/AsyncExitStack/AbstractAsyncContextManager为 3.7,aclosing/AsyncContextDecorator为 3.10,chdir为 3.11。完整清单见 02 contextlib 的"版本可用性说明"。contextvars的ContextVar.name属性自 3.7.1 加入;Token上下文管理器与泛型标注自 3.14 加入。sys.monitoring在 3.11 及更早版本中不存在;3.13 及以前只有BRANCH一个条件分支事件。annotationlib整体标记为 "Added in version 3.14";typing.get_type_hints()自 3.14 起新增format参数,typing.ForwardRef自 3.14 起成为annotationlib.ForwardRef的别名。dataclasses关键里程碑:3.10 新增match_args/kw_only/slots/KW_ONLY;3.11 新增weakref_slot;3.13__eq__改为逐字段比较;3.14 新增field(doc=)与make_dataclass(decorator=)。详见 06 dataclasses。traceback关键里程碑:clear_frames为 3.4;面向对象三件套为 3.5;直接传异常对象为 3.10;异常组/注释支持为 3.11;exc_type_str/show_group为 3.13;walk_stack语义变化为 3.14。详见 07 traceback。
二、如何检查当前 Python 版本#
在终端中:
python --version
# 或
python3 --version
在 Python 代码内:
import sys
print(sys.version) # 完整版本串,例如 3.14.7 (......)
print(sys.version_info) # sys.version_info(major=3, minor=14, micro=7, ...)
# 判断是否满足某模块的最低版本
if sys.version_info >= (3, 14):
print("可用 annotationlib 与 3.14 新特性")
elif sys.version_info >= (3, 12):
print("可用 sys.monitoring,但 annotationlib 不可用")
elif sys.version_info >= (3, 7):
print("可用 contextvars 与 dataclasses,但 sys.monitoring 不可用")
else:
print("本教程六个模块的多数能力均不可用")
sys.version_info 是一个命名元组,可通过 .major、.minor、.micro 等字段做精确比较。
三、各模块的 import 语句与最低版本提示#
contextlib(几乎无版本门槛)#
from contextlib import contextmanager, ExitStack, redirect_stdout, suppress, nullcontext, chdir
from contextlib import asynccontextmanager, aclosing, AsyncExitStack
极早期版本即提供
contextlib模块;个别 API(如chdir需 3.11、aclosing需 3.10)注意对应版本。
contextvars(需 3.7+)#
import contextvars
var = contextvars.ContextVar("var", default=42) # 需 3.7+
# 3.14 新增:Token 作为上下文管理器
with var.set(100):
...
sys.monitoring(需 3.12+)#
import sys
events = sys.monitoring.events # 需 3.12+
sys.monitoring.use_tool_id(4, "my-tool")
sys.monitoring.set_events(4, events.PY_START)
# 3.14 新增:
# events.BRANCH_LEFT / events.BRANCH_RIGHT
易错点:
sys.monitoring是sys内部的一个命名空间,import sys.monitoring或from sys.monitoring import events都会抛出ModuleNotFoundError。必须import sys后使用sys.monitoring。
annotationlib(需 3.14+)#
from annotationlib import get_annotations, Format, ForwardRef
from annotationlib import annotations_to_string, call_annotate_function, call_evaluate_function
在早于 3.14 的环境中,
import annotationlib会抛ModuleNotFoundError。官方指出 typing-extensions 提供了get_annotations()的向后移植版本,可在旧版本上使用。
dataclasses(需 3.7+)#
from dataclasses import dataclass, field, fields, asdict, astuple, replace
@dataclass
class C:
x: int = 0
# 3.14 新增:field(doc=...) 与 make_dataclass(decorator=...)
dataclasses自 3.7 引入,但slots/kw_only/match_args(3.10)、weakref_slot(3.11)、doc/decorator(3.14)等较新参数需注意对应版本。
traceback(早期即存在,关键 API 3.4/3.5+)#
import traceback
traceback.print_exc() # 打印当前异常
tb = traceback.TracebackException.from_exception(exc) # 3.5+
# 3.13 起默认彩色输出;3.14 变更 walk_stack 生成器语义
traceback模块自 Python 早期版本即存在,但面向对象三件套(TracebackException/StackSummary/FrameSummary)需 3.5+。
四、小结:先查版本,再写代码#
把这六个模块按"引入版本"排序(由旧到新):contextlib → traceback(3.4/3.5 补全)→ contextvars/dataclasses(3.7)→ sys.monitoring(3.12)→ annotationlib(3.14)。动手前先用 sys.version_info 确认环境;一旦遇到 ModuleNotFoundError 或 AttributeError,首先怀疑版本不足,再排查 import 写法,可参考 10 FAQ 与排错 中的错误对策表。
五、章节导航#
上一章:概述 ←