mypy报错‘Type[Array]非泛型不可索引’的含义与解决方法
错误含义解释
mypy默认将Array["int"]这类方括号索引语法判定为泛型类型的实例化操作,它会检查目标类是否是泛型类(即继承自typing.Generic或定义了类型变量)。你的Array只是普通类,mypy认为它不支持这种索引操作,因此抛出错误。
你添加的__getitem__是实例方法,仅对Array的实例生效,而Array["int"]是直接对类本身进行索引,所以这个方法无法解决问题。
解决方法
方法1:定义类索引协议并标注Array
通过自定义协议告诉mypy,Array类支持__class_getitem__操作:
from typing import Protocol, runtime_checkable @runtime_checkable class ClassIndexable(Protocol): @classmethod def __class_getitem__(cls, key): ... class Array: def __init__(self, underlying): self.underlying = underlying def __class_getitem__(cls, key): return Array(key) def __str__(self): return f"Array({self.underlying=})" # 告知mypy Array符合ClassIndexable协议 Array: ClassIndexable def foo(name, kind): pass foo(name="x", kind=Array["int"])
方法2:最小化泛型标注
给Array添加最基础的泛型继承,让mypy认可索引语法,同时不影响原有逻辑:
from typing import TypeVar, Generic T = TypeVar('T') class Array(Generic[T]): def __init__(self, underlying): self.underlying = underlying def __class_getitem__(cls, key): return Array(key) def __str__(self): return f"Array({self.underlying=})" def foo(name, kind): pass foo(name="x", kind=Array["int"])
内容的提问来源于stack exchange,提问作者Barry
相关产品推荐
相关产品推荐

