You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:15:04