You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:02:41