解决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
相关产品推荐
相关产品推荐

