为何Union[List[List[int]],List[int]]会被mypy判定为List[Union[...]]?
类型提示兼容问题:mypy报Union类型赋值不兼容
问题代码
from typing import Union, List, Any v: Union[list[list[int]], list[int]] = [-1,3,1,6,-5] # Create a list of ints if not isinstance(v[0], list): v = [v] v = [v] # Cast list of ints to list of list of ints print(v)
mypy报错信息
functions.py:5: error: Incompatible types in assignment
(expression has type "List[Union[List[List[int]], List[int]]]",
variable has type "Union[List[List[int]], List[int]]") [assignment]
Found 1 error in 1 file (checked 1 source file)
报错原因
你给v声明的类型是Union[list[list[int]], list[int]],限定它只能是一维整数列表或二维整数列表。但执行v = [v]时,新的v会变成包裹原类型的列表:
- 若原
v是一维list[int],新v为list[list[int]] - 若原
v是二维list[list[int]],新v为list[list[list[int]]]
mypy会严格匹配声明类型,它推断[v]的类型是List[Union[list[list[int]], list[int]]],和你声明的Union类型不兼容,因此报错。
另外你提到“实际最终对象是list[list[int]]”,但实际代码执行后v是三维列表——因为你先把一维列表包裹成二维,接着又做了一次包裹操作。
解决方案(无法修改代码逻辑时)
方案1:扩展类型声明范围
修改v的类型声明,覆盖最终实际类型:
v: Union[list[list[int]], list[int], list[list[list[int]]]] = [-1,3,1,6,-5]
方案2:使用类型断言
通过cast明确告诉mypy最终类型:
from typing import Union, List, cast v: Union[list[list[int]], list[int]] = [-1,3,1,6,-5] if not isinstance(v[0], list): v = [v] v = cast(list[list[list[int]]], [v]) print(v)
或者直接用注释跳过类型检查:
v = [v] # type: ignore[assignment]
内容的提问来源于stack exchange,提问作者Indiano
相关产品推荐
相关产品推荐

