为了将大类拆分为多个文件,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,但我对需要更高版本的解决方案也很感兴趣。
答案 0 :(得分:1)
仅在类型检查期间通过使用C
标志来导入typing.TYPE_CHECKING
来修复循环导入。
这将在运行时保留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