Mypy对List[int]赋值给List[float]等操作报错,除Sequence/Mapping外有其他合法方案吗
Mypy可变容器跨数值类型赋值的其他解决方法
这类赋值报错的核心原因是
List、Dict为不变类型:虽然int是float的子类型,但可变的List[int]并不属于List[float]的子类型,Mypy为了避免后续写入非法元素的风险,会默认禁止这类赋值。
除了替换为Sequence、Mapping这类只读协变容器外,还有以下可行方法:
方法1:创建变量时显式标注目标类型
不需要让Mypy自动推导临时变量的类型,创建时直接标注为你需要的目标类型即可:from typing import List, Dict a: List[float] c: List[float] = [1,2] a = c # 类型匹配,无报错 b: Dict[str, float] d: Dict[str, float] = {"1": 1, "2": 2} b = d # 类型匹配,无报错方法2:使用
typing.cast强制声明类型
如果你可以确认后续不会往容器中写入不符合原有类型的元素,可通过cast向Mypy担保类型符合要求,该操作仅作用于类型检查阶段,不会修改运行时数据:from typing import List, Dict, cast a: List[float] c = [1,2] a = cast(List[float], c) b: Dict[str, float] d = {"1": 1, "2": 2} b = cast(Dict[str, float], d)方法3:显式转换容器内元素类型
最安全的方案,直接将容器内的元素转换为目标类型,让实际类型完全匹配,不需要绕过类型检查规则:from typing import List, Dict a: List[float] c = [1,2] a = [float(num) for num in c] b: Dict[str, float] d = {"1": 1, "2": 2} b = {key: float(value) for key, value in d.items()}方法4:使用
type: ignore注释跳过检查
属于兜底方案,不推荐常规使用,可以指定忽略的错误类型缩小影响范围:from typing import List, Dict a: List[float] c = [1,2] a = c # type: ignore[assignment] b: Dict[str, float] d = {"1": 1, "2": 2} b = d # type: ignore[assignment]
内容的提问来源于stack exchange,提问作者marshallmallow
相关产品推荐
相关产品推荐

