为itertools.product返回值添加类型注解时遇到的类型不兼容问题
itertools.product返回值添加类型注解时遇到的类型不兼容问题
这个问题我之前也碰到过,本质是mypy做静态类型检查时,没法自动识别itertools.product用repeat=2时返回的是固定长度的二元组,所以才会抛出类型不兼容的错误。给你几个可行的解决办法:
方法一:用类型强制转换(cast)明确告诉mypy类型
直接通过typing.cast把转换后的元组类型强制指定为函数需要的类型,让mypy认可这个类型匹配:from typing import cast from itertools import product def f(x: tuple[tuple[int, int], ...]): ... x = cast(tuple[tuple[int, int], ...], tuple(product(range(10), repeat=2))) f(x)这种方式简单直接,适合快速解决问题,缺点是如果后续修改了
repeat的值(比如改成3),mypy不会再提醒你类型不匹配,需要自己注意维护。方法二:拆分
repeat参数为多个迭代器参数
如果你的场景是固定生成二元组,不如直接给product传两个相同的迭代器,代替repeat=2,这样mypy就能自动推断出返回的是tuple[int, int]类型的元素:from itertools import product def f(x: tuple[tuple[int, int], ...]): ... # 直接传两个range(10),代替repeat=2 x = tuple(product(range(10), range(10))) f(x)这种方式更安全,mypy能准确推断类型,也不需要额外的类型注解,唯一的小缺点是当repeat次数很多时(比如repeat=5),写多个重复的迭代器参数会有点繁琐。
方法三:封装一个返回固定类型的辅助函数
如果你需要多次用到这种生成固定长度元组的场景,可以封装一个专属函数,提前指定好返回类型,这样每次调用时都能得到正确的类型提示:from itertools import product from typing import Iterable, Tuple def f(x: tuple[tuple[int, int], ...]): ... def product_pair(it: Iterable[int]) -> Iterable[Tuple[int, int]]: return product(it, repeat=2) x = tuple(product_pair(range(10))) f(x)这种方式代码可读性更好,也方便统一维护,后续如果需要修改生成的元组长度,只需要调整辅助函数的返回类型即可。
备注:内容来源于stack exchange,提问作者Gaussian97
相关产品推荐
相关产品推荐

