类型提示下用isinstance,如何消除Mypy的不可达代码警告?
解决方案
要让Mypy认可这个运行时类型检查,同时保留类型安全,可以调整__add__方法的参数类型标注,并利用Mypy的类型守卫特性:
- 将
other的类型标注从str改为object——Python的特殊方法(如__add__)在运行时确实可能接收任意类型的参数,这个标注更贴合实际执行场景。 - 保留
isinstance(other, str)的检查,Mypy会将这个检查视为类型守卫,自动推断检查通过后other的类型为str,既不会认为后续代码有问题,也不会标记前面的return NotImplemented为不可达。
修改后的代码如下:
class Foo: def __init__(self, string: str) -> None: self._string = string def __add__(self, other: object) -> str | NotImplemented: if not isinstance(other, str): return NotImplemented return f'{self._string}foo{other}'
说明
- 参数类型改为
object后,Mypy会意识到other可能是任意类型,因此isinstance检查是有意义的,不会再标记return NotImplemented为不可达代码。 - 返回类型标注为
str | NotImplemented,明确了方法可能的返回值类型,符合Mypy的类型检查要求,同时也和实际运行时的行为一致。 - 运行时逻辑完全保留:当
other不是字符串时返回NotImplemented,让Python尝试调用对方的__radd__方法,若也无法处理则抛出TypeError,符合Python的运算符重载规范。
内容的提问来源于stack exchange,提问作者InSync
相关产品推荐
相关产品推荐

