MyPy报错Incompatible return value type(got Union[X,Y], expected X)如何解决
错误原因
MyPy作为静态类型检查工具,会严格校验函数返回值是否符合声明的类型。你声明func_1的返回值为固定的X类型,但func_2的返回值为Union[X, Y],意味着其有概率返回Y类型的结果,MyPy无法确认你在func_1中调用func_2拿到的结果一定是X类型,因此抛出类型不兼容的错误,规避运行时出现类型不符合预期的问题。
无重复代码的解决方法
- 运行时类型收窄
在func_1中增加类型判断逻辑,确认返回结果为X类型后再返回,MyPy可以识别这类类型收窄逻辑,自动停止报错。示例代码如下:
def func_1(...) -> X: res = func_2(...) if isinstance(res, X): return res # 可根据业务逻辑处理Y类型的情况,比如抛出异常 raise TypeError("func_2返回了非预期的Y类型结果")
- 用cast强制标注类型
如果你的业务逻辑可以100%保证本次调用func_2返回的结果一定是X类型,可以使用typing.cast直接告知MyPy将返回结果认定为X类型,该方法仅作用于静态类型校验阶段,不会产生额外的运行时代码开销。示例代码如下:
from typing import cast def func_1(...) -> X: return cast(X, func_2(...))
- 为func_2增加重载声明
如果func_2的返回类型可以通过入参的类型/取值确定,可以用@overload装饰器为func_2声明多组入参和返回值的对应关系,MyPy会根据你调用时传入的参数自动匹配对应的返回类型,无需额外强制转换。示例代码如下:
from typing import overload, Union, Literal @overload def func_2(flag: Literal[True], ...) -> X: ... @overload def func_2(flag: Literal[False], ...) -> Y: ... def func_2(flag: bool, ...) -> Union[X, Y]: # 原有func_2的实现逻辑不变 ...
只要你在func_1中调用func_2时传入的flag为True,MyPy就会自动判定返回值为X类型,不会抛出错误。
内容的提问来源于stack exchange,提问作者Abdelrahmen Ayman
相关产品推荐
相关产品推荐

