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

Mypy 1.0.0中Incompatible return value type问题的咨询

问题解析:Mypy返回值类型不兼容错误

这是Mypy的预期行为,并非你的代码逻辑错误,核心原因是Mypy对变量赋值和直接返回的类型推断规则存在差异:

原因说明

  • 当你把条件表达式的结果赋值给变量test时,Mypy会自动将变量类型推断为两个分支类型的最小公共超类型。在你的代码里,C继承自B(最终继承A),D直接继承A,两者的最小公共超类型是A。此时返回test就会和函数声明的Union[C, D]类型不匹配,触发类型错误。
  • 而在run_2中直接返回条件表达式时,Mypy会保留两个分支的具体类型,推断返回值为Union[C, D],和函数声明的返回类型一致,因此不会报错。

解决方法

你可以通过以下几种方式修复run函数的类型错误:

1. 显式标注变量类型

给test变量指定明确的Union[C, D]类型,让Mypy跳过自动推断:

from typing import Union

class A:
    def __init__(self, element: str):
        self._element = element

class B(A): ...
class C(B): ...
class D(A): ...

def run(value: bool) -> Union[C, D]:
    test: Union[C, D] = (
        C("foo")
        if value is True
        else D("bar")
    )

    return test  # 无类型错误

2. 直接返回条件表达式(推荐)

像run_2那样直接返回条件表达式,这种写法更简洁,也能让Mypy正确推断联合类型。

3. 使用cast强制类型转换(不推荐)

如果必须保留中间变量,可以用typing.cast强制指定类型,但这种写法会绕过Mypy的类型检查,仅在特殊场景下使用:

from typing import Union, cast

# ... 类定义省略

def run(value: bool) -> Union[C, D]:
    test = (
        C("foo")
        if value is True
        else D("bar")
    )

    return cast(Union[C, D], test)  # 强制转换类型

内容的提问来源于stack exchange,提问作者dalkio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:21:35