循環インポートを使用しない 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) を作成することをお勧めします。これにより、型チェックの精度が向上します。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3