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

解决mypy中Dict联合类型收缩失效的类型检查错误

解决mypy对Union类型字典的类型窄化问题

先看你遇到的代码和报错:

from typing import Dict, List, Union

data: Dict[str, Union[List[str], str]] = {}

key = "a"
value = "b"
if isinstance(data[key], list):
    data[key].append(value)  # Item "str" of "Union[List[str], str]" has no attribute "append"
else:
    temp = data[key]
    data[key] = [temp, value]  # List item 0 has incompatible type "Union[List[str], str]"; expected "str"

你预期的逻辑没问题,但mypy无法直接对data[key]这种字典索引操作做类型窄化——它会把每次索引访问都当成独立的表达式,没办法关联两次data[key]的类型判断结果。

不需要加冗余类型断言,只需要把data[key]的值先存到一个局部变量里,让mypy能跟踪这个变量的类型:

from typing import Dict, List, Union

data: Dict[str, Union[List[str], str]] = {}

key = "a"
value = "b"
current_val = data[key]
if isinstance(current_val, list):
    current_val.append(value)
else:
    data[key] = [current_val, value]

这样处理后:

  • if分支里,current_val会被mypy正确识别为List[str],调用append完全合法
  • else分支里,current_val会被窄化为str,存入列表时类型完全匹配,不会再触发报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:34:57