带有导入类方法的Python类型提示

时间:2020-08-03 17:58:01

标签: python python-3.7 python-typing

为了将大类拆分为多个文件,this answer建议在import级别使用class命令来加载其定义可以移至其他模块的方法。作为最小的例子,

class_def.py

class C:
    from _methods import m

_methods.py

def m(self):
    return "hello"

通常,大多数具有代码完成功能的IDE将识别在某些类中定义为绑定方法的函数,并且self将被自动识别为具有定义该方法的类的类型。不幸的是,在上述情况下,我没有在类内部定义m。仅从_methods.py看,self应该具有C类型是不可能的。

m的定义中,如果我插入以self.开头的行,则我的IDE无法建议m或我可能在{{1}中实现的任何其他方法}。

显而易见的解决方案是添加类型提示:

C

但是现在我们有了一个循环导入:from class_def import C def m(self: C): return "hello" 的定义导入C,但是_methods的导入_methods。如何在不引入循环导入的情况下创建类型提示?

我目前正在使用Python 3.7,但我对需要更高版本的解决方案也很感兴趣。

1 个答案:

答案 0 :(得分:1)

  1. 仅在类型检查期间通过使用C标志来导入typing.TYPE_CHECKING来修复循环导入。

  2. 这将在运行时保留C的值未定义。要么用引号(C括起来,要么导入"C"

__future__.annotations变体1:

_methods.py

from typing import TYPE_CHECKING if TYPE_CHECKING: from class_def import C def m(self: "C"): return "hello" 变体2:

_methods.py