Python 3.12 未废弃旧版泛型语法,但类型检查器(如 mypy 1.5.1+)不再识别 class Box(Generic[T]) 的泛型语义,仅支持 PEP 695 新语法 class Box[T]:,导致静态类型检查失效。

from typing import Generic, TypeVar + class Box(Generic[T])),它依然能运行,但类型检查器(如 mypy、pyright)会忽略其泛型语义,导致类型安全失效——这不是语法错误,而是**静态检查层面的静默降级**。
旧写法还能跑,但 mypy 不认了
你写:class Box(Generic[T]): ...,解释器不报错,实例化也照常工作。但 mypy 1.5.1+ 默认把这种写法当作普通类处理,Box[int] 不会被推导为泛型实例,参数校验、类型传播全部失效。
- 现象:mypy 对
box: Box[str]不做约束,传入int也不报警 - 原因:PEP 695 明确将
class Box[T]:定为唯一被类型检查器识别的泛型类声明语法 - 兼容性:旧写法不是语法弃用,而是“类型系统弃用”——解释器兼容,工具链不配合
class Box[T]: 是唯一被类型检查器认可的泛型类声明方式
必须带方括号和类型参数名,且不能省略 class 关键字。T 的作用域仅限类体内,无需 from typing import TypeVar。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- ✅ 正确:
class Box[T]: def __init__(self, item: T) -> None: ... - ❌ 错误:
class Box: ...(无泛型)、Box[T] = ...(不是类)、class Box[T, U][V]:(不支持嵌套方括号) - 注意:类体中所有
T引用自动绑定;类外写def f(x: T):会触发NameError
为什么旧写法在类型层面被绕过?
因为 PEP 695 要求类型检查器只在语法层识别泛型结构:class Name[Param]: 是硬性信号,而 Generic[T] 继承只是运行时元信息,无法可靠提取泛型契约。
- 旧机制依赖
__orig_bases__解析,容易受多重继承、动态修改干扰 - 新语法让类型参数位置、数量、顺序在 AST 阶段就确定,工具链可直接映射到符号表
- 结果:mypy 对
class Box[T]:能生成完整泛型签名,对class Box(Generic[T]):只当普通类加注解处理

















