1

以下は私のコードです。

main.py:

import moduleA
print('It works!')

moduleA.py:

import moduleB
def functionA():
    return 0

moduleB.py:

import moduleA
globalVariableFromModuleB = moduleA.functionA()

実行すると、次のエラー メッセージが表示されます。

$ python main.py 
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    import moduleA
  File "/home/asa/bugs/moduleA.py", line 3, in <module>
    import moduleB
  File "/home/asa/bugs/moduleB.py", line 8, in <module>
    globalVariableFromModuleB_1 = functionB()
  File "/home/asa/bugs/moduleB.py", line 6, in functionB
    return moduleA.functionA()

Q1: 私の場合、moduleB は明示的に moduleA をインポートするため、動作することを期待していますが、動作しません。これは、Python がインポートをキャッシュし、2 回行わないためですか? しかし、失敗するのではなく、既にキャッシュされている moduleA.functionA() をメモリから取得できないのはなぜですか? したがって、現在の動作はバグだと思います。

Q2: "globalVariableFromModuleB = moduleA.functionA()" という行を削除し、循環インポート "import moduleA" だけを残せば、問題はありません。そのため、循環依存は Python では禁止されていません。私の例を示しているように、それらが正しく機能しない場合、それらは何のために許可されますか?

Q3: "import moduleA" を "from moduleA import functionA" に変更すると、メイン プログラムが機能せず、別のメッセージ "ImportError: cannot import name functionA" が表示されて失敗します。

また、私の場合のように、アプリケーションを再設計したくない人のための回避策をここに投稿したいと思います。
回避策(実験的に発見されました)。main.py の「import moduleA」の前に「 import moduleB」を追加するには、次のようにします。

# main.py
import moduleB
import moduleA
print('It works!')

しかし、main.py は moduleB の API を直接使用しないため、コードのこのインポートに長いコメントを残す必要がありました。

そのようなケースを解決し、上記の3つの質問に答える方法を提案してください。

4

2 に答える 2