Mypy赋值不兼容类型错误:表达式类型为object
问题原因
Mypy报错的核心是静态类型推断与实际代码逻辑不匹配,具体两点:
filter_requirements的类型被Mypy判定为list[tuple[str, object]]:- 你声明
kwargs时只写了dict,没有指定键值类型,Mypy会把kwargs.get()返回的region、city、state都判定为object类型。 - 这导致
filter_requirements里嵌套的元组类型混乱,最终整个列表的第二个元素被统一推断为object。
- 你声明
- 动态索引的类型无法静态确定:
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
相关产品推荐
相关产品推荐

