为何mypy对含元组元素的元组报类型错误,而集合却不报错?
问题解析:mypy对集合与元组类型检查的差异
核心原因:集合与元组的类型语义不同
1. 集合Set[tuple]的兼容逻辑
集合是无固定长度的异构容器,Set[tuple]表示“所有元素都是tuple类型的集合”。mypy推断右边集合的元素类型是Tuple[str, int, bool],而Tuple[str, int, bool]是tuple的子类型(所有具体元组类型都属于泛型tuple的范畴),因此赋值时类型兼容,不会触发错误。
2. 元组Tuple[tuple]的类型不兼容原因
元组在类型系统里是固定长度的容器:
Tuple[tuple]特指长度为1,唯一元素是任意tuple的元组;- 你右边的表达式实际类型是
Tuple[Tuple[str, int, bool], Tuple[str, int, bool]],也就是长度为2,元素为具体元组类型的元组。
这两个类型的长度和元素数量不匹配,因此mypy报类型不兼容错误。
解决方法
如果要定义“任意长度、元素为tuple的元组”,需要用可变长度元组语法Tuple[tuple, ...](...表示允许任意数量的元素),修改后的代码如下:
from typing import Set, Tuple x: Set[tuple] = {('a', 100, True), ('b', 200, False)} y: Tuple[tuple, ...] = (('a', 100, True), ('b', 200, False))
此时mypy检查会通过,因为Tuple[tuple, ...]兼容任意长度、元素为tuple的元组实例。
内容的提问来源于stack exchange,提问作者thomas_chang
相关产品推荐
相关产品推荐

