事象
同じディレクトリDに
D
┠ __init__.py
┠ M1.py
┗ M2.py
の3ファイルがあるとしましょう。
それぞれが以下のスクリプト記述がされているとします。
__init__.py
from D.M1 import f1
from D.M2 import f2
M1.py
from D import f2
def f1():
print("f1")
f2()
M2.py
def f2():
print("f2")
ここで、外からD.M1
をimport
するとcircular import
エラーが発生します。
原因
M1
とM2
モジュールは、M1→M2
の一方通行依存関係なので、機能的には循環参照にはなっていません。
しかし、
M1.py
from D import f2
の部分で、M1
は__init__.py
をimport
しています。
そして、__init__.py
がM1.py
をimport
しているため、綺麗にcircular import
になるわけです。
対策
同じディレクトリのモジュールを参照するときは、丁寧にそのファイルを指定してモジュールを呼びましょう
このように修正します。
M1.py
-from D import f2
+from D.M2 import f2
def f1():
print("f1")
f2()
また、モジュールに依存関係があるときは、同じディレクトリに配置するのではなく、ディレクトリを作って下位モジュールであると明示するのがモジュール設計的には綺麗だと思います。