1

main.py に関数 foo() があります。main.py では、create.py をインポートします。しかし、main から foo() を必要とする create.py の関数があります。main.py がエラーになるため、main.py を create.py にインポートできません...これはある種の競合状態であると思います。

create.py 名前空間で foo() を使用できるようにするにはどうすればよいですか? foo() をモジュールにして、1 つの関数だけを main.py と create.py の両方でインポートするのは、ちょっと非効率に思えます。

4

3 に答える 3

1

モジュールをインポートすると、Python のimport機構がそのモジュールのコードを実行してモジュールに入力しますが、1 回だけです。同じモジュールを複数回インポートすると、sys.modules代わりにキャッシュからフェッチされます。無限のインポート ループで終わる方法はありません。

ただし、Python はモジュールsys.modulesのコードを実行する前にモジュールを追加するため、モジュール全体が実行されるまで完全には取り込まれません。したがって、モジュール A がモジュール B をインポートし、モジュール B がモジュール A を再度インポートすると、部分的に初期化されたモジュールが表示されます。これがここで起こっているようです。完全に入力される前にmainインポートされるため、 で何かにアクセスしようとすると、まだ存在しません。createcreatemain

いくつかの解決策:

  1. 上記のように、共有コードを別のモジュールに移動します。インポートは 1 回だけ行われ、Python はコンパイルされたバイト コードを PYC ファイルにキャッシュするため、それほどコストはかかりません。
  2. すべてのコードを関数に移動し、import nameどこでも使用し (no from name import)、スクリプトの最後からメイン関数を呼び出します。このようにして、他のモジュールを実行する前に、すべてのモジュールのインポートが完了します。
  3. import createアクセスが必要な関数の下にステートメントを移動して、コードcreate.pyが実行される前に定義されるようにします (これはばかげていますが、最後の手段として使用できます)。
于 2013-07-21T21:13:40.330 に答える
1

単純なハックですが、これは一般的な状況では役に立ちません。

インポートによって呼び出されない場合は、main.py に create.py をインポートします。

# in main.py
if __name__ == '__main__':
    from create import *

これにより、main.py を実行するpython main.pyと create がインポートされ、create がインポートされ、main が再度インポートされますが、今回は、インポートされていることがわかり__name__ == '__main__'ますFalse。したがって、インポートの循環チェーンは停止します。

他のスクリプトで main.py をインポートしようとすると、create.py がインポートされないため、機能しないことを覚えておいてください。

したがって、これを機能させるには、main.py を実行する必要があります。インポートすることはできません。

于 2013-07-21T19:39:53.563 に答える