Mypy检查自定义幂集函数时出现标准库函数类型不兼容错误的问题咨询
问题分析与解决
这完全是正常现象哦,不是Mypy的bug,问题出在咱们给函数标注的类型注解和实际返回值的类型不匹配上。
为什么会触发这个错误?
先看咱们的函数返回类型:List[Tuple[int]],这个类型表示列表里的每个元素都是长度固定为1的int元组,但幂集的实际输出可不是这样——它包含了空元组()、单元素元组(0,)、双元素元组(0,1)等等,元组长度是变化的。
再看itertools.combinations的类型:当你调用combinations(s, r)时,它返回的是Iterator[Tuple[int, ...]],这里的Tuple[int, ...]是变长元组类型,表示长度为r的int元组(r可以是0、1、2...)。而chain.from_iterable期望传入的是一个包含Iterable[Tuple[int]]的可迭代对象,但咱们传入的生成器产生的是不同长度的元组迭代器,类型自然不兼容,Mypy就会抛出这个错误。
修正方案
只需要把函数的返回类型改成List[Tuple[int, ...]]就可以了,这个类型能准确表示“包含任意长度int元组的列表”,完美匹配幂集的输出结构。
修正后的完整代码:
# -*- coding: utf-8 -*- """ Created on Tue Mar 30 14:59:19 2021 @author: Paddy3118 """ from itertools import chain, combinations from typing import List, Tuple def powerset(s: List[int]) -> List[Tuple[int, ...]]: """powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3) .""" return list(chain.from_iterable(combinations(s, r) for r in range(len(s)+1))) if __name__ == '__main__': assert powerset([0, 1, 2]) == [(), (0,), (1,), (2,), (0, 1), (0, 2), (1, 2), (0, 1, 2)]
验证修正结果
现在重新运行Mypy检查:
mypy --show-error-context --show-column-numbers --show-error-codes --pretty pwrset_mypy.py
你会看到Mypy提示Success: no issues found in 1 source file,同时函数的断言依然能正常通过,完全不影响原有功能。
内容的提问来源于stack exchange,提问作者Paddy3118
相关产品推荐
相关产品推荐

