Python 3.12使用PEP 695类型别名触发Mypy错误,如何解决?
PEP 695类型别名在Mypy中报错的原因解析
问题重现
在Python 3.12中使用PEP 695的新语法定义类型别名时,Mypy报错PEP 695 type aliases are not yet supported,报错代码如下:
type IntList = list[int] # 报错行 type OtherType = int # 报错行 class test: pass type SomeType = test # 报错行
改用PEP 613的写法则无报错:
IntList: TypeAlias = list[int] OtherType: TypeAlias = int class test: pass SomeType: TypeAlias = test
原因说明
- Python版本支持无问题:Python 3.12确实原生支持PEP 695的
type语法定义类型别名,你的操作没有错误,也不需要额外导入。 - Mypy支持滞后:Mypy对PEP 695新特性的支持是逐步迭代的,旧版本的Mypy尚未适配这种新语法。需要升级Mypy到足够新的版本(Mypy 1.5及以上开始部分支持PEP 695,后续版本逐步完善对该特性的支持)。
- 两种写法的差异来源:
type IntList = list[int]是PEP 695(Python 3.12+)推出的原生类型别名语法,属于更简洁的新写法。IntList: TypeAlias = list[int]是PEP 613(Python 3.9+)引入的类型别名标注方式,Mypy对这种写法的支持更早、更成熟,所以不会触发报错。
解决方案
- 若想使用PEP 695的简洁写法,直接升级Mypy到最新稳定版本即可。
- 若暂时不想升级工具,继续使用PEP 613的
TypeAlias标注写法即可正常通过Mypy检查。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

