「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Python で型ヒントの循環インポートを解決するにはどうすればよいですか?

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

2024 年 11 月 17 日に公開
ブラウズ:503

How to Resolve Cyclic Imports for Type Hinting in Python?

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

大きなクラスを 2 つの小さなクラスに分割しようとすると、循環の問題が発生します。輸入品。 「main」クラスは mixin クラスをインポートし、mixin クラスはそのタイプ ヒントで「main」クラスを参照します。これによりインポート サイクルが発生し、型ヒントが適切に機能しなくなります。

これを解決するには、次のアプローチを検討できます:

# 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):
        ...
# 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):
        ...

この例では、Python の TYPE_CHECKING 定数を使用して、「メイン」クラスを条件付きでインポートします。コードを実行すると、定数が False であるため、インポート ステートメントはスキップされます。ただし、mypy などの型チェック ツールは、if TYPE_CHECKING ブロック内のコードを解釈し、func2.

の型注釈を認識します。別のアプローチには、前方参照の使用が含まれます:

# 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'):
        ...

ここで、func2 の型アノテーションは、後でインポートされるクラスの名前を表す文字列です。どちらのアプローチでも、タイプ ヒントを効果的に使用するには、Python 3.7 以降を使用する必要があります。

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

リリースステートメント この記事は次の場所に転載されています: 1729656617 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3