1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CA Tech LoungeAdvent Calendar 2023

Day 8

【Python】同じディレクトリの__init__を使うとcircular importになる

Posted at

事象

同じディレクトリ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.M1importするとcircular importエラーが発生します。

原因

M1M2モジュールは、M1→M2の一方通行依存関係なので、機能的には循環参照にはなっていません。

しかし、

M1.py
from D import f2

の部分で、M1__init__.pyimportしています。
そして、__init__.pyM1.pyimportしているため、綺麗にcircular importになるわけです。

対策

同じディレクトリのモジュールを参照するときは、丁寧にそのファイルを指定してモジュールを呼びましょう

このように修正します。

M1.py
-from D import f2
+from D.M2 import f2

def f1():
    print("f1")
    f2()

また、モジュールに依存関係があるときは、同じディレクトリに配置するのではなく、ディレクトリを作って下位モジュールであると明示するのがモジュール設計的には綺麗だと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?