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
相关产品推荐
相关产品推荐

