わかりづらいタイトルですみません。
pythonのimportの挙動に関して感覚的にわからない点があったため、お分かりになる方がいらっしゃればお教えいただきたいです。
あるフォルダに以下の3つのファイルがあります。
- main.py
- obj.py
- load_obj_from_main.py
各ファイルの中身は以下です。
main.py
1 print('main.py started') 2 var = 'this is var' 3 4 print('main.py attempts to import Obj') 5 from obj import Obj 6 print('main.py finished')
obj.py
1 print('obj.py started') 2 from main import var 3 print(var) 4 5 class Obj: 6 pass 7 8 print('obj.py finished')
まずはここで
python3 main.py
を実行します。
実行結果は以下のように、循環参照でエラーが発生します
main.py started main.py attempts to import Obj obj.py started main.py started main.py attempts to import Obj Traceback (most recent call last): File "main.py", line 5, in <module> from obj import Obj File "/home/yuki/.___tmp____/circle_import/obj.py", line 2, in <module> from main import var File "/home/yuki/.___tmp____/circle_import/main.py", line 5, in <module> from obj import Obj ImportError: cannot import name Obj
ここで、load_obj_from_main.pyを準備し、以下のように書きます。
load_obj_from_main.py
1 from main import Obj 2 3 print(vars(Obj))
python3 load_obj_from_main.py
を実行します。
出力は以下のようになります。
main.py started main.py attempts to import Obj obj.py started this is var obj.py finished main.py finished {'__module__': 'obj', '__dict__': <attribute '__dict__' of 'Obj' objects>, '__weakref__': <attribute '__weakref__' of 'Obj' objects>, '__doc__': None}
循環参照が発生せずに、ちゃんとObjが出力されています。
感覚的には、直接main.pyを実行した時と同じように、main.pyの読み込みが完了していないため、varの準備ができておらず、再度main.pyを読み込みに行ってobj.pyのObjを再度読もうとし、未定義のためimportエラーが発生するかと思ったのですがしっかりvarを読み込めています。
この直接main.pyを読んだ時と違って間接的に(?)読み込んだ時はなぜmain.pyのvarを取得できているのでしょうか。
python初心者で未熟者のためなぜこのような挙動になっているのか理解できておりません。
皆様にご教授いただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/12 22:06