恐怕通常没有一种非常优雅的方式来处理导入周期。您的选择是重新设计代码以消除循环依赖性,或者如果不可行,请执行以下操作:
# some_file.pyfrom typing import TYPE_CHECKINGif TYPE_CHECKING: from main import Mainclass MyObject(object): def func2(self, some_param: 'Main'): ...
该
TYPE_CHECKING常量始终
False在运行时运行,因此不会评估导入,但是mypy(和其他类型检查工具)将评估该块的内容。
我们还需要将
Main类型注释放入字符串中,以有效地向前声明它,因为该
Main符号在运行时不可用。
如果您使用的是Python 3.7+,我们至少可以通过利用PEP
563来跳过必须提供显式字符串注释的情况:
# some_file.pyfrom __future__ import annotationsfrom typing import TYPE_CHECKINGif TYPE_CHECKING: from main import Mainclass MyObject(object): # Hooray, cleaner annotations! def func2(self, some_param: Main): ...
该
from __future__ import annotations进口将使 所有 类型提示弦而跳过评估他们。这可以使我们的代码更符合人体工程学。
综上所述,与mypy一起使用mixins可能会需要比您现在更多的结构。Mypy建议一种基本上就是
deceze所描述的方法-
创建一个ABC,您的类
Main和
MyMixin类都继承。如果您最终需要做一些类似的事情以使Pycharm的检查器满意,我不会感到惊讶。



