当T绑定类含可选参数时,Type[T]→T类方法为何在MyPy中报错?
为什么MyPy 0.590会报“Unsupported type Type["T"]”错误?
这个问题其实是MyPy旧版本的类型系统局限性导致的——你用的MyPy 0.590是2018年的老版本,当时它还没完全支持带bound约束的TypeVar和Type[]结合使用的语法。
你的代码里T是绑定到A的TypeVar,在类方法fn里用Type[T]注解cls参数,这种写法在这个老旧版本里被判定为不支持的类型结构,所以才触发了错误提示。
解决办法
针对这个旧版本,有两种可行的处理方式:
1. 调整类型注解写法(适配旧版本)
把cls的注解改成Type[A],然后在返回值处用cast明确类型,绕过旧版本的检查限制:
from typing import Type, TypeVar, cast AnyT = TypeVar('AnyT') T = TypeVar('T', bound='A') class A: def __init__(self, arg: AnyT = None) -> None: pass @classmethod def fn(cls: Type[A]) -> T: return cast(T, cls())
2. 升级MyPy到新版本(彻底解决)
这个问题在MyPy 0.600及以后的版本中已经被修复了,新版本完全支持Type[T]结合带bound的TypeVar的写法。如果你的环境允许,直接升级到最新稳定版的MyPy,你的原始代码就能正常通过类型检查,不需要做任何修改。
另外你提到的典型场景:如果__init__是用来复制另一个实例(比如__init__(self, other: T)),在新版本MyPy中,你原本的写法完全可以正常工作,不用额外调整。
内容的提问来源于stack exchange,提问作者Keigo Kawamura
相关产品推荐
相关产品推荐

