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

如何修复mypy提示的DataContainer返回值类型不兼容错误

修复mypy返回值类型不兼容错误

问题代码

DataObj数据类

from dataclasses import dataclass
from typing import List, Tuple, Type

@dataclass
class DataObj:
    """ DataObj creates an object for each record in data
    """
    name: str
    profit: int
    space: float

DataContainer类

class DataContainer:
    """ Data Container class holding objects of DataObj class
    """
    def __init__(self, data_tuple_list: List[Tuple[str, int, float]]) -> None:
        self.container = []
        for data_tuple in data_tuple_list:
            self.container.append(DataObj(*data_tuple))

    def __getitem__(self, n: int) -> Type[DataObj]:
        return self.container.__getitem__(n)

mypy报错信息

error: Incompatible return value type (got "DataObj", expected "Type[DataObj]")
Found 1 error in 1 file (checked 1 source file)

用户尝试两种修改均无效:

  • 将self.container标注为List[DataObj],仍返回相同的返回值类型不兼容错误;
  • 将self.container标注为List[Type[DataObj]],则出现append方法参数类型不兼容错误。

解决方案

错误根源在于__getitem__的返回类型标注错误:Type[DataObj]代表的是DataObj类本身,而该方法实际返回的是DataObj的实例对象,正确的返回类型应该直接写DataObj。同时给self.container加上正确的类型标注List[DataObj],让mypy明确容器内的元素类型。

修改后的完整代码:

from dataclasses import dataclass
from typing import List, Tuple

@dataclass
class DataObj:
    """ DataObj creates an object for each record in data
    """
    name: str
    profit: int
    space: float

class DataContainer:
    """ Data Container class holding objects of DataObj class
    """
    def __init__(self, data_tuple_list: List[Tuple[str, int, float]]) -> None:
        self.container: List[DataObj] = []
        for data_tuple in data_tuple_list:
            self.container.append(DataObj(*data_tuple))

    def __getitem__(self, n: int) -> DataObj:
        return self.container.__getitem__(n)

内容的提问来源于stack exchange,提问作者Lawhatre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:06:30