使用tuple构造器时mypy类型不兼容报错问题咨询
为什么tuple构造器会触发mypy类型错误,而字面量写法正常?
问题代码示例
def foo() -> tuple[int, int, bool]: a: int = 1 b: int = 2 c: bool = True results: tuple[int, int, bool] = tuple((a, b, c)) # mypy 报错 results: tuple[int, int, bool] = (a, b, c) # mypy 校验通过 results: tuple[int, int, bool] = a, b, c # mypy 校验通过 return results
报错信息
初始报错:
error: Incompatible types in assignment (expression has type "Tuple[object, ...]", variable has type "Tuple[int, int, bool]") [assignment]编辑后报错:
error: Incompatible types in assignment (expression has type "Tuple[int, ...]", variable has type "Tuple[int, int, bool]")
原因解析
字面量写法的精确推导
用(a, b, c)或a, b, c这种元组字面量时,mypy会直接根据元素的数量和各自的具体类型,推导出精确的固定长度元组类型tuple[int, int, bool],和变量声明的类型完全匹配,所以校验通过。tuple构造器的类型特性
tuple()构造器的设计是接收一个可迭代对象,返回的是变长同类型元组(比如tuple[T, ...],表示任意数量的T类型元素),而非固定长度、多类型的元组:- 当传入混合类型元素的可迭代对象时,mypy会把元素类型向上推导到最通用的父类型(比如
object),返回tuple[object, ...]; - 当传入同类型元素的可迭代对象时,返回
tuple[int, ...]这类变长元组。
不管哪种情况,变长元组的类型都和你声明的固定长度、多类型元组不兼容——mypy认为变长元组的元素数量和类型不固定,无法保证和目标类型匹配,因此抛出错误。
- 当传入混合类型元素的可迭代对象时,mypy会把元素类型向上推导到最通用的父类型(比如
内容的提问来源于stack exchange,提问作者winter
相关产品推荐
相关产品推荐

