Python 3.12泛型函数新语法为def funcT,无需TypeVar和Generic,T作用域限于该函数内;漏写方括号或错用大小写(如List而非list)会导致NameError或mypy报错。

Python 3.12 的泛型函数新语法(def func[T](...))能直接省掉 TypeVar 和 typing.Generic,但写错一个符号或漏掉方括号,mypy 就会报 NameError 或 Invalid type —— 不是配置问题,是语法解析失败。
泛型函数声明必须带方括号和类型参数名
旧写法要先定义 TypeVar,再在签名里重复用;新写法把类型参数直接挂到函数名后,作用域自动限定在该函数内。
-
def first[T](items: list[T]) -> T:✅ 正确:T 是函数级类型形参,无需提前声明 -
def first(items: list[T]) -> T:❌ 报NameError: name 'T' is not defined,T 未被引入作用域 -
def first[T, U](a: T, b: U) -> tuple[T, U]:✅ 支持多参数,顺序即语义,不强制 K/V -
def first[T] (items: list[T]) -> T:⚠️ 注意空格:方括号紧贴函数名,否则某些 IDE 可能解析异常(虽不报错,但 Pylance 提示失效)
类型参数不能跨函数复用
T 只活在它被声明的那个 def 体内,哪怕两个函数看起来一模一样,也不能共用同一个 T 名——这不是限制,是设计意图:每个泛型函数独立建模。
-
def get_first[T](x: list[T]) -> T:和def get_last[T](x: list[T]) -> T:中的两个T互不关联,各自推导 -
def process[T](x: T) -> T:返回值类型严格绑定输入:传入str,返回就是str;传入int,返回就是int -
def identity(x: T) -> T:❌ 错误:没声明T,mypy直接报Invalid type "T"
与内置类型混用时不用导入,但注意大小写
Python 3.12 允许直接使用 list、dict、tuple 等内置名作泛型,无需 from typing import List, Dict —— 但必须小写,大写仍需导入且已弃用。
立即学习“Python免费学习笔记(深入)”;
-
def filter_items[T](data: list[T], pred: callable[[T], bool]) -> list[T]:✅ 运行+检查都 OK -
def filter_items[T](data: List[T], ...):❌List在 3.12 已 soft-deprecated,mypy警告,PyCharm 标灰 -
def build_map[K, V](keys: list[K], vals: list[V]) -> dict[K, V]:✅dict小写即可,K/V 任意命名
IDE 和类型检查器必须对齐 Python 3.12 解释器
即使代码完全合法,IDE 仍可能标红或跳转失败——大概率不是你写错了,而是环境没切到 3.12。
- VS Code:确认
python.defaultInterpreterPath指向真实python3.12,且已启用Pylance(非基础 Python 扩展) - PyCharm:Settings → Project → Python Interpreter 必须选中 3.12 解释器,不是 venv 里“名字叫 3.12”但底层是 3.11 的假环境
- 常见症状:
SyntaxError: invalid syntax出现在[T]处 → 重启语言服务器或 IDE,再检查解释器路径
最容易被忽略的是作用域边界:T 不是全局变量,也不是模块级常量,它只存在于那个 def 的缩进块里。想跨函数共享逻辑?别试图复用 T 名,用具体类型注解或拆成工具类更稳妥。


















