首页  >  文章  >  后端开发  >  如何解决Python中类型提示的循环导入?

如何解决Python中类型提示的循环导入?

Linda Hamilton
Linda Hamilton原创
2024-10-23 12:27:01393浏览

How to Resolve Cyclic Imports for Type Hinting in Python?

Python 中没有循环导入的类型提示

在尝试将一个大类拆分为两个较小的类时,您会遇到循环问题进口。 “main”类导入 mixin 类,并且 mixin 类在其类型提示中引用“main”类。这会导致导入循环,导致类型提示无法正常工作。

要解决此问题,您可以考虑以下方法:

<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>
<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 的类型注释。

另一种方法涉及使用前向引用:

<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn