如何用mypy正确标注键为int或str的Union类型字典?
解决mypy对字典Union类型的初始化报错问题
当你标注Union[dict[int, Any], dict[str, Any]]类型的变量并赋值空字典时,mypy会报错,原因是空字典的类型为Dict[<nothing>, <nothing>],无法自动匹配到你定义的Union类型——这个Union要求字典的键必须是全部为int或全部为str,而空字典的键类型是未确定的<nothing>,不符合约束。
以下是几种可行的解决方法:
方法一:使用cast强制类型转换
通过cast告诉mypy,这个空字典属于Union中的某一种具体类型:
from typing import Union, Any, cast special_dict: Union[dict[int, Any], dict[str, Any]] special_dict = cast(dict[int, Any], {})
方法二:显式初始化具体类型的字典
直接初始化一个符合Union中某一类型的空字典,而不是用字面量{}:
from typing import Union, Any special_dict: Union[dict[int, Any], dict[str, Any]] = dict[int, Any]()
方法三:后续赋值时明确键类型
如果后续会给字典添加键值对,mypy会根据你添加的键自动推断字典类型,此时初始化空字典不会报错:
from typing import Union, Any special_dict: Union[dict[int, Any], dict[str, Any]] special_dict = {} special_dict[123] = "test" # mypy自动推断为dict[int, Any] # 或者 # special_dict["key"] = 456 # mypy自动推断为dict[str, Any]
方法四:自定义类型别名(可选)
如果需要多次使用这个类型,可以定义别名来简化代码:
from typing import Union, Any SpecialDict = Union[dict[int, Any], dict[str, Any]] special_dict: SpecialDict = dict[str, Any]()
内容的提问来源于stack exchange,提问作者fgregg
相关产品推荐
相关产品推荐

