Python で型ヒントの循環インポートを解決するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-10-23 12:27:01
オリジナル
498 人が閲覧しました

How to Resolve Cyclic Imports for Type Hinting in Python?

循環インポートを使用しない Python での型ヒント

大きなクラスを 2 つの小さなクラスに分割しようとすると、循環の問題が発生します。輸入品。 「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 constant は、「メイン」クラスを条件付きでインポートするために使用されます。コードを実行すると、定数が False であるため、インポート ステートメントはスキップされます。ただし、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 の type アノテーションは、後でインポートされるクラスの名前を表す文字列です。どちらのアプローチでも、タイプ ヒントを効果的に使用するには、Python 3.7 以降を使用する必要があります。

ミックスインとタイプ ヒントを使用するには、コード内で追加の構造化が必要になる場合があることに注意してください。たとえば、mypy では、「メイン」クラスと mixin クラスの両方が継承する抽象基本クラス (ABC) を作成することをお勧めします。これにより、型チェックの精度が向上します。

以上がPython で型ヒントの循環インポートを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート