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

mypy提示守卫子句代码不可达,本地运行报错如何解决?

解决mypy提示「Statement is unreachable」的问题

问题分析

你的代码中,__add__方法的参数other标注了类型Union[MyClass, float, int],mypy会基于这个注解做静态分析——它认为所有传入这个方法的other必然属于这三种类型之一,因此if not isinstance(other, (MyClass, float, int))这个条件永远不可能成立,里面的日志语句和抛出错误的代码就被判定为「不可达」,从而触发报错。

而mypy-play.net上没有报错,大概率是因为该平台使用的mypy版本、配置和你本地环境不同,没有启用这个层级的不可达代码检查。

解决方案

方案1:调整类型注解,保留运行时检查

如果需要保留运行时的类型校验逻辑,同时让mypy认可这个条件判断的合理性,可以把other的类型注解扩展为包含object:

def __add__(self, other: Union[MyClass, float, int, object]) -> MyClass:

这样mypy会意识到存在不符合预期的类型传入的可能性,就不会再标记该代码块为不可达。

方案2:移除运行时检查,依赖静态类型校验

如果你的项目已经完全依赖mypy做静态类型检查,确保不会有不符合类型的参数传入,那么可以直接删除这个if判断块,简化代码:

def __add__(self, other: Union[MyClass, float, int]) -> MyClass:
    return self.add(other)

方案3:忽略mypy错误(不推荐)

如果临时需要绕过这个检查,可以给报错的行加上# type: ignore注释,但这种方式会掩盖潜在的代码问题,不建议长期使用:

self.logger.error("Other must be either MyClass, float or int") # type: ignore[unreachable]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:27:36