Mypy报错Invalid index type "str" 已加类型标注仍报错原因问询
Mypy报错触发原因说明
核心根因
- 你给
listsOfDicts元素的b字段标注的类型为Union[str, Dict[str, str]],Mypy静态校验时会认为该字段存在两种合法类型:字符串、字符串键值对字典。 - 你直接调用
i["b"]["c"]时,Mypy会覆盖所有类型分支做校验:如果i["b"]是字符串类型,字符串仅支持int(下标索引)或slice(切片)作为索引参数,传入字符串"c"属于非法索引,因此触发对应报错。
注意:即使你当前测试用的字面量里
b字段都是字典,Mypy也不会参考运行时实际值,只会严格按照你声明的类型标注做校验。
常见解决方案
方案1:修正类型标注
如果业务逻辑里b字段永远不会是字符串,调整类型标注匹配实际场景即可:
# 原标注 listsOfDicts: List[Dict[str, Union[str, Dict[str, str]]]] = [...] # 若不需要兼容b为字符串的场景,可调整为更精准的标注,比如用TypedDict明确字段类型 from typing import TypedDict class Item(TypedDict): a: str b: Dict[str, str] listsOfDicts: List[Item] = [...]
方案2:添加类型窄化逻辑
如果b字段确实存在字符串场景,在校验取值前先判断类型即可:
result = [] for item in listsOfDicts: b_val = item["b"] if isinstance(b_val, dict): result.append(d[b_val["c"]]) # 自行补充b为字符串时的处理逻辑
方案3:临时类型断言
如果仅需要临时绕开校验,确定当前代码运行时b一定是字典,可以用类型断言:
from typing import cast [d[cast(Dict[str, str], i["b"])["c"]] for i in listsOfDicts]
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

