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

Mypy赋值不兼容类型错误:表达式类型为object

问题原因

Mypy报错的核心是静态类型推断与实际代码逻辑不匹配,具体两点:

  1. filter_requirements的类型被Mypy判定为list[tuple[str, object]]:
    • 你声明kwargs时只写了dict,没有指定键值类型,Mypy会把kwargs.get()返回的region、city、state都判定为object类型。
    • 这导致filter_requirements里嵌套的元组类型混乱,最终整个列表的第二个元素被统一推断为object。
  2. 动态索引的类型无法静态确定:
    valid_depth是运行时计算的整数,Mypy没法在静态检查阶段确认filter_requirements[valid_depth]的具体结构,只能认定它是tuple[str, object],但你要把它赋值给标注了str和List[Tuple[str, str]]的变量,类型自然不兼容。
解决办法

1. 给filter_requirements明确标注类型

直接告诉Mypy这个列表的元素结构,避免它靠模糊推断:

filter_requirements: typing.List[typing.Tuple[str, typing.List[typing.Tuple[str, typing.Optional[str]]]]] = [
    # 原列表内容不变
]

用typing.Optional[str]是因为kwargs.get()可能返回None,如果你的校验逻辑确保这些变量不会为None,也可以直接写str。

2. 给kwargs添加类型标注

先明确kwargs的键值类型,让region等变量的类型更清晰:

kwargs: typing.Dict[str, typing.Optional[str]] = {}
region, city, state = kwargs.get('region'), kwargs.get('city'), kwargs.get('state')

这样Mypy能更准确推断filter_requirements的类型,从根源减少类型不匹配问题。

3. (不推荐)临时跳过检查

如果只是想快速绕过这个报错,可以在出错行加注释:

main_select, required_where = filter_requirements[valid_depth]  # type: ignore

但这会跳过Mypy的静态检查,可能埋下隐性类型问题,优先推荐前两种方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:15:20