0

假设我正在为一个不受我控制的大型遗留代码库编写Python插件。该代码库公开了一个具有多个函数的对象,我可以从插件代码调用这些函数:

def plugin_entrypoint(ctx:LegacyCodebaseObject):...

其中一个函数会导致插件控制器在出现错误的情况下终止插件:

def plugin_entrypoint(ctx:LegacyCodebaseObject):...ctx.fail(reason=“foo”,…)#从不返回

然而,作为一个遗留的代码库,这些函数都没有类型注释。我的插件type-annotated和我使用mypy,这会引起麻烦,因为mypy认为ctx.fail()可能返回:

def plugin_entrypoint(ctx:LegacyCodebaseObject):...尝试:some_data=some_function()例外情况e除外:ctx.fail(reason=f“准备数据失败:{e}”)#从不返回other_function(some_data)#mypy抱怨some_ddata可能在赋值之前被引用

有可能以某种方式进行注释吗LegacyCodebaseObject.fail()以mypy能够理解的方式从我的代码中提取?

我可以简单地包装ctx.fail()到我自己用Never类型注释的函数中,但这将是不理想的,我的插件将无法通过代码审查。

1
  • 如果是遗留问题,请考虑发布仅存根包部分仅存根包如果您需要更多类型的API。这应该是最小的努力-它不像传统的代码库会改变,所以你甚至不需要保持任何同步。 评论 2月27日1:17

1答案1

重置为默认值
4

一种方法是利用类型_检查和继承。

假设遗留代码如下所示:

#深入传统代码库类LegacyCodebaseObject:def-foo(自身):。。。def-bar(self,baz,*,qux):。。。def失败(自我):引发异常

类型_检查分支,使用别名将其导入到代码中,然后使用正确的名称创建子类:

如果TYPE_CHECKING(类型_检查):从legacy_codebase将LegacyCodebaseObject导入为_LegacyCodebase对象类LegacyCodebaseObject(_LegacyCodebase对象):#此处输入正确的类型提示def-fail(self,reason:str,**kwargs:Any)->从不:。。。#其他方法也可以这样做

在另一个分支中,只需正常导入:

其他:从legacy_codebase导入LegacyCodebaseObject

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.