为什么mypy对嵌套字典赋值操作的类型检测会出现异常?
mypy 0.910 嵌套字典赋值异常原因解析
无标注报错的核心原因
该现象属于mypy 0.910版本对异构字典的自动类型推断特性:
- 未添加显式类型标注时,mypy会计算字典所有键对应值的公共父类型,作为该字典值的统一类型约束。示例代码中的字典存在两类值:
'a'对应str类型,'b'对应dict[str, int]类型,0.910版本的推导逻辑会将二者的公共父类型误判定为Collection[str],这是一个仅支持遍历、不支持索引赋值的抽象集合类型,因此对d['b']['d']赋值时会触发不支持索引操作的报错。
标注dict后正常的原因
当你为变量添加d: dict的显式标注时,相当于告知mypy该变量为无类型约束的通用字典,等价于dict[Any, Any],此时mypy会跳过对该字典的键、值类型以及内部结构的严格检查,所有赋值操作都会被判定为合法,因此不再触发报错。
严格类型校验可选方案
如果需要保留mypy的严格类型检查能力,同时支持嵌套字典赋值,可以添加更精准的类型标注:
from typing import Dict, Union d: Dict[str, Union[str, Dict[str, Union[int, str]]]] = { 'a': 'a', 'b': { 'c': 1 } } d['b']['d'] = 'b'
内容的提问来源于stack exchange,提问作者DeepSpace
相关产品推荐
相关产品推荐

