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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:54:05