python 3.9起list[str]可直接用,因pep 585为内置类型添加__class_getitem__;3.10成实践分水岭,typing.list被标记为deprecated,|替代union,新项目普遍采用list[str]。

typing.List 不再需要导入,是因为 Python 3.9 起通过 PEP 585 正式允许内置容器类型(如 list、dict、tuple)直接接受泛型参数。这不是 3.10 新增的,但 3.10 是第一个默认启用该行为且广泛落地的版本。
list[str] 能用,是因为 PEP 585 改变了内置类型的元类行为
- Python 3.9+ 中,
list类本身被赋予了__class_getitem__方法,使其支持像list[str]这样的语法,并返回一个有效的类型对象(types.GenericAlias实例) - 旧写法
typing.List[str]在运行时其实也返回types.GenericAlias(3.9+),但它是绕路实现,属于兼容层 - IDE 和 mypy 等工具在 3.9+ 默认识别
list[str]为合法类型注解,无需任何额外配置
为什么你看到“3.10 不再需要”这种说法
- 3.9 是 PEP 585 的起始版本,但部分发行版/IDE 初始支持不完整
- 3.10 成为事实上的分水岭:
-
typing.List被明确标记为 deprecated(虽未报错,但 mypy 3.10+ 默认警告) -
Union开始被|运算符替代(PEP 604),进一步削弱typing导入必要性 - 大量新项目和教程从 3.10 起统一采用
list[str]写法,形成实践惯性
-
容易踩的坑
-
isinstance(x, list[str])会报错 —— 泛型类型不是运行时可检查的,只能用于类型提示,不能用于isinstance或issubclass - 想做类型元编程(比如提取泛型参数)时,
get_origin(list[str])返回list,而get_origin(typing.List[str])在 3.9+ 也返回list,但旧版本可能返回typing.List,兼容性需留意 - 如果项目要支持 Python 3.8 或更早,
list[str]会直接语法错误,必须保留from typing import List并用List[str]
真正关键的分界点不是 3.10,而是你项目的最低 Python 版本。只要确定不支持 3.8 及以下,list[str] 就是干净、标准、无副作用的选择。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











