Python は、循環インポートに陥る可能性のある状況を思いとどまらせることを知っています。しかし、循環インポートの状況で from-import が通常のインポートよりも恣意的に寛大でないように見える理由について、Python の内部構造を理解したいと思いました。
たとえば、次のコードはコンパイルされます。
# main.py
import CommonUtil
# commonutil.py
import util
class CommonUtil:
# some code that uses util.Util
pass
# util.py
import commonutil
class Util:
# some code that uses commonutil.CommonUtil
pass
ただし、このコードは次のことを行いません。
# main.py
import CommonUtil
# commonutil.py
import util
class CommonUtil:
# some code that uses util.Util
pass
# util.py
from commonutil import CommonUtil
class Util:
# some code that uses CommonUtil
pass
Traceback (most recent call last):
File "main.py", line 1, in <module>
import CommonUtil
File "commonutil.py", line 1, in <module>
import util
File "util.py", line 1, in <module>
from commonutil import CommonUtil
ImportError: cannot import name CommonUtil
すべてのインポートが完了する前に関連するクラスを使用しようとしない限り、コンパイラ エラーは発生しません。しかし、エイリアシングを行おうとすると失敗します。from-import が使用されている場合にのみ、このエラーが頭をもたげる原因となる Python の内部で何が起こっているのかを誰かが説明できますか? 第二に、これを回避する簡単な方法はありますか? (明らかな「共有コードを 3 番目のモジュールに引き出す」以外に、私はおそらくそうするでしょう。)