まず第一に、私は、循環輸入のトピックに対する多くの質問と回答がすでにあることを知っています。
答えは多かれ少なかれ、「モジュール/クラス構造を適切に設計すれば、循環インポートは必要ありません」です。それは本当です。私は現在のプロジェクトのために適切なデザインを作るために一生懸命努力しました、私はこれで成功したと思います。
しかし、私の特定の問題は次のとおりです。チェックするクラスを含むモジュールによってすでにインポートされているモジュールでタイプチェックが必要です。しかし、これはインポートエラーをスローします。
そのようです:
foo.py:
from bar import Bar
class Foo(object):
def __init__(self):
self.__bar = Bar(self)
bar.py:
from foo import Foo
class Bar(object):
def __init__(self, arg_instance_of_foo):
if not isinstance(arg_instance_of_foo, Foo):
raise TypeError()
解決策1:文字列比較によってタイプをチェックするように変更すると、機能します。しかし、私はこのソリューションが本当に好きではありません(文字列の比較は、単純な型チェックにはかなり費用がかかり、リファクタリングに関しては問題が発生する可能性があります)。
bar_modified.py:
from foo import Foo
class Bar(object):
def __init__(self, arg_instance_of_foo):
if not arg_instance_of_foo.__class__.__name__ == "Foo":
raise TypeError()
解決策2: 2つのクラスを1つのモジュールにパックすることもできます。しかし、私のプロジェクトには「Bar」の例のように多くの異なるクラスがあり、それらを異なるモジュールファイルに分けたいと思います。
私自身の2つの解決策は私には選択肢がありません:この問題のより良い解決策はありますか?