如何在自有代码中为外部遗留类的fail方法添加mypy可识别的类型注解?
解决遗留库方法无类型注解导致的Mypy报错问题
方法1:创建Mypy Stub文件(推荐)
在你的项目里创建和遗留库同名的目录,比如遗留库叫legacy_lib,就新建legacy_lib/文件夹,然后在里面创建__init__.pyi文件,写入补全后的类型注解:
from typing import Never class LegacyCodebaseObject: def fail(self, *args, **kwargs) -> Never: ...
Mypy会自动优先读取这个stub文件,把fail方法标记为永远不会返回,后续代码里的「变量可能未赋值就引用」报错会直接消失。这种方式完全不侵入业务代码,适合长期维护。
方法2:在业务代码中用类型断言
如果不想额外创建文件,可以在调用fail前,把ctx转换成带正确注解的类型:
from typing import Never, cast # 定义带注解的虚拟类 class AnnotatedLegacyObj: def fail(self, *args, **kwargs) -> Never: ... # 转换类型后调用 ctx = cast(AnnotatedLegacyObj, ctx) ctx.fail("出错了") # Mypy会判定后续代码不会执行,不再报未赋值错误
补充说明
Never类型专门用来标记永远不会返回的函数(比如直接终止程序、抛出未捕获异常的函数),完美匹配fail方法的行为。Python3.10及以上版本Never在标准库typing里,3.9及以下版本需要安装typing_extensions包来使用。
内容的提问来源于stack exchange,提问作者intelfx
相关产品推荐
相关产品推荐

