
Python 中没有循环导入的类型提示
在尝试将一个大类拆分为两个较小的类时,您会遇到循环问题进口。 “main”类导入 mixin 类,并且 mixin 类在其类型提示中引用“main”类。这会导致导入循环,导致类型提示无法正常工作。
要解决此问题,您可以考虑以下方法:
1 2 3 4 5 6 7 8 9 10 | <code class = "python" ># main.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from mixin import MyMixin
class Main(object):
def func1(self, xxx: Any):
...</code>
|
登录后复制
1 2 3 4 5 6 7 8 9 10 | <code class = "python" ># mixin.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from main import Main
class MyMixin(object):
def func2(self: Main, xxx: Any):
...</code>
|
登录后复制
在此示例中,Python 的 TYPE_CHECKING常量用于有条件地导入“主”类。运行代码时,由于常量为 False,因此跳过 import 语句。然而,像 mypy 这样的类型检查工具会解释 if TYPE_CHECKING 块中的代码并识别 func2 的类型注释。
另一种方法涉及使用前向引用:
1 2 3 4 5 6 7 8 9 10 | <code class = "python" ># mixin.py
from __future__ import annotations
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from main import Main
class MyMixin(object):
def func2(self, xxx: 'Main' ):
...</code>
|
登录后复制
这里, func2 的类型注释是一个字符串,表示稍后将导入的类的名称。这两种方法都需要使用 Python 3.7 或更高版本才能有效地使用类型提示。
请记住,使用 mixins 和类型提示可能需要在代码中进行额外的结构化。例如,mypy 建议创建一个抽象基类 (ABC),您的“主”类和 mixin 类都继承自该类。这可以提高类型检查的准确性。
以上是如何解决Python中类型提示的循环导入?的详细内容。更多信息请关注PHP中文网其他相关文章!