検索した後、私は自分自身で答えを見つけます。
本来、循環インポートはfrom … import …
の問題です。インポートされたモジュールは、モジュールコードの実行後にのみ返されるためです。
説明するために、a.pyをb.pyにインポートし、a.pyにbをインポートしたとします。 import a
とimport b
については、sys.modulesを参照して/ bを探し、新しいモジュールを入れて返すだけです。一方、b.pyでfrom a import c
は、我々がa.pyから開始このようなコード(a.pyでfrom b import d
ための同様の擬似パイソン)
if 'a' not in sys.modules:
sys.modules[a] = (A new empty module object)
run every line of code in a.py
add the module a to its parent's namespace
return module 'a'
を
を有し、Bの空のモジュールを置きますsys.modulesに渡し、b.pyの実行を開始し、aをsys.modulesに入れてa.pyを実行します。次にそれはfrom b import d
に再び行き、sys.modulesの中のbを見つけますが、それは空ですが、エラーをスローします:no属性d。
PS1:参照先が間違っています。 import ... as ...
は循環インポートに適しています。
PS2:from a import c
は、Python 3でa.cをインポートするのと同じです。