python 3.8 不支持 list[int] 等内置泛型语法,会报 typeerror,必须用 typing.list[int];3.11 默认支持 pep 585,list[int] 原生可用,typing.list 已弃用。

list[int] 在 3.8 中会直接报 TypeError: 'type' object is not subscriptable,3.11 则完全支持且默认启用 PEP 585 —— 这是两者最实际、最常踩的坑。
3.8 中用 list[int] 会崩溃,必须改用 typing.List
Python 3.8 把 list 当作一个类型对象,不支持下标操作(即不能写 list[int])。解释器看到这个就会抛出 TypeError: 'type' object is not subscriptable,哪怕只是注释、没运行也报错。
- 必须显式导入:
from typing import List,然后写numbers: List[int] -
Dict、Set、Tuple同理,都要用大写首字母的typing版本 - 如果项目里混用了
list[int]和List[int],3.8 下会部分失败,CI 构建可能直接中断
3.11 默认支持 list[int],但 typing.List 仍可用
3.11 完全实现 PEP 585,所有内置容器类型(list、dict、set、tuple、frozenset、deque、defaultdict 等)都原生支持泛型语法。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
-
def process(items: list[str]) -> dict[int, float]: ...可直接运行,无需导入typing -
typing.List没被移除,但官方文档已标记为“deprecated for removal in Python 3.13” - MyPy、Pyright 等工具在 3.11 下默认按 PEP 585 解析,
typing.List会被警告为冗余
跨版本兼容写法:别硬切,用 typing.TYPE_CHECKING 隔离
如果你的代码要同时跑在 3.8 和 3.11 上(比如开源库或遗留系统升级过渡期),不能简单删掉 typing 导入 —— 那样 3.8 会炸,3.11 会警告。
- 把类型导入包进条件块:
if TYPE_CHECKING:,运行时不执行,只供静态检查器读取 - 示例:
from typing import TYPE_CHECKING if TYPE_CHECKING: from typing import List, Dict numbers: "List[int]" = [1, 2, 3] scores: "Dict[str, float]" = {"a": 1.0} - 字符串字面量注解(
"List[int]")可绕过运行时解析,3.8 和 3.11 都认
容易被忽略的细节:tuple 和 Callable 的行为不一致
PEP 585 并没覆盖全部类型。比如 tuple[int, str] 在 3.11 是合法的,但 Callable[[int], str] 依然必须用 typing.Callable —— 内置 callable 不支持泛型。
-
tuple是特例:3.9+ 支持tuple[int, str],但空元组tuple[()]在 3.11 才稳定,3.9–3.10 可能报错 -
Callable、Iterator、Generator等至今没进入内置泛型,仍依赖typing - 如果你用 Pydantic v2+ 或 FastAPI,它们内部做了兼容封装,但纯 stdlib 场景下这些边界必须手动处理
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










