3

私は辞書を維持しており、それは構成ファイル内にロードされています。ディクショナリは JSON ファイルからロードされます。

config.py で

name_dict = json.load(open(dict_file))

を使用して、この構成ファイルを他のいくつかのスクリプト(file1.py、file2.py、...、filen.py)にインポートしています

import config

声明。私の質問は、 config.py スクリプトが実行されるのはいつですか? 複数のスクリプト内で行われるすべてのインポート呼び出しに対して実行されるとは限りません。しかし、import ステートメントが呼び出されると、正確にはどうなるでしょうか。

4

1 に答える 1

2

モジュールの最上位コードは、最初に実行されたときに 1 回実行されますimport。その後、モジュール オブジェクトは で見つかり、sys.modules再生成するためにコードが再実行されることはありません。

これにはいくつかの例外があります:

  • reload、 明らかに。
  • 誤って同じモジュールを2 つの異なる名前でインポートする (たとえば、モジュールがパッケージ内にあり、パッケージの途中にディレクトリがあるsys.path場合、.この場合、コードは 2 回実行されます)。mypackage.mymodulemymodule
  • 標準の動作を置き換えるインポート フック/カスタム インポートのインストール。
  • で明示的にモンキーsys.modules
  • imp/importlibなどから関数を直接呼び出す。
  • 特定のケースmultiprocessing(および のように間接的に使用するモジュールconcurrent.futures)。

Python 3.1 以降の場合、これはすべてThe import systemで詳しく説明されています。特に、検索セクションを見てください。(multiprocessing特定のケースは、そのモジュールについて説明されています。)

以前のバージョンの Python では、コードを読んだり実験したりして、さまざまなソースから動作を推測する必要がありました。ただし、十分に文書化された新しい動作は、具体的に説明されている方法を除いて、古い動作のように動作することを目的としているため、通常は 2.x であっても 3.x のドキュメントを読むだけで済みます。


一般に、モジュール内の最上位コードが 1 回実行されるか複数回実行されるかに依存したくないことに注意してください。たとえば、トップレベルの関数定義が与えられた場合、関数オブジェクトを比較したり、関数オブジェクト (本体だけでなく定義自体を意味する) が依存するグローバルを再バインドしたりしない限り、違いはありません。ただし、これにはいくつかの例外があり、開始時の構成ファイルのロードは例外の完全な例です。

于 2013-09-30T22:01:53.540 に答える