やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Python循環インポートの罠

別のモジュールが互いに参照しあうとImportErrorになるらしい……。

参照

Pythonの循環インポート - mfumiの日記

ソースコード

A.py

from B import b
def A(): print('A')
b()

B.py

from A import a
def b(): print('B')
a()

実行

$ python A.py
Traceback (most recent call last):
  File "A.py", line 1, in <module>
    from B import b
  File "/tmp/B.py", line 1, in <module>
    from A import a
  File "/tmp/A.py", line 1, in <module>
    from B import b
ImportError: cannot import name 'b'

循環インポートというらしい。モジュールが互いに参照しあい無限ループに陥る。

エラー文言がわかりにくい

トレースバックでは循環する経緯を表しているように見える。しかし、最後のエラーがよくわからない。なぜbが出てきているのか。永久にインポート文以降にはいかないはず。このエラー文言だと循環インポートであるとわかりにくい。

Pythonのエラーがわかりにくいのはいつものことだが……。

所感

相互参照した場合はどうやっても参照できないということか。うまいことやってほしいのだが……。

モジュールの依存関係に気を使わねばならないことがわかった。C言語C#Javaにこんな問題あったか?