Mypy调用add()向set添加tuple时报类型不兼容错误的原因是什么?
报错原因
Mypy是静态类型检查工具,报错和你提前声明的变量类型不匹配有关,和Python运行时set是否支持tuple元素无关:
你声明adgroups_by_campaign_id的类型为Dict[CampaignId, Set[str]],相当于你明确告诉Mypy:这个字典里每个值都是「只允许存字符串元素的集合」,但你后续调用add()方法传入的是Tuple[str, str]类型的二元组,和你声明的集合元素类型冲突,所以Mypy会抛出类型不兼容错误。
解决方案
- 如果你的业务逻辑确实需要集合存储二元组,直接修改变量的类型声明即可,将
Set[str]调整为Set[Tuple[str, str]],修改后的声明代码如下:
from typing import Dict, Set, Tuple from collections import defaultdict adgroups_by_campaign_id: Dict[CampaignId, Set[Tuple[str, str]]] = defaultdict(set)
- 如果你本来预期集合里存的是字符串,调整
add()方法的入参,改成符合str类型要求的内容即可。
补充说明:Python运行时的set确实支持添加所有可哈希类型的元素,tuple属于不可变类型满足可哈希要求,所以如果不开启Mypy校验,你的代码是可以正常运行的,但这不符合你自己提前声明的类型约束。
内容的提问来源于stack exchange,提问作者Jekson
相关产品推荐
相关产品推荐

