13

アプリケーションの実行の一部として、リモートデータベースから辞書を作成します。このプロセスはかなりI/Oが重いので、このディクショナリの「シングルトン」インスタンスを作成し、アプリケーションで必要に応じて呼び出すことにしました。

コードは次のようになります(in Dictionaries.py):

state_code_dict = None

def get_state_code_dict():
    global state_code_dict
    if state_code_dict == None:
        state_code_dict = generate_state_code_dict()
    return state_code_dict

次に、必要に応じて関数をインポートして呼び出しget_state_code_dict()ます。再初期化または再利用されているかどうかを確認するためにprintステートメントを追加しましたstate_code_dictが、再利用されていることがわかりました(これは私が望む機能です)。state_code_dictアプリケーションを存続させるインスタンスが実行されるのはなぜですか?

編集

get_state_code_dict関数を複数のファイルにインポートします。

4

2 に答える 2

24

これは、モジュールのインポートがどのように機能するかについてのPython言語リファレンスの説明です。

(1)モジュールを見つけ、必要に応じて初期化します; (2)ローカル名前空間で1つまたは複数の名前を定義します

(強調が追加されました。)ここで、モジュールを初期化することは、そのコードを実行することを意味します。この実行は、必要な場合、つまりモジュールが現在のプロセスで以前にインポートされていない場合にのみ実行されます。Pythonモジュールはファーストクラスのランタイムオブジェクトであるため、最初のインポート時に初期化されたシングルトンになります。

get_state_dict_codeこれは、関数が必要ないことを意味することに注意してください。state_code_dictトップレベルで初期化するだけです。

state_code_dict = generate_state_code_dict()

より詳細な説明については、Thomas Wouters、特にによるこの講演を参照してください。最初の部分— 04:20頃—ここで、彼は「すべてが実行時である」という原則について説明します。

于 2012-06-07T17:35:51.057 に答える
14

私はlarsmansの回答に投票しました。例を追加したかっただけです。

hello.py:

hi = 'hello'

print(hi)

def print_hi():
    print(hi)

ipythonセッション:

In [1]: from hello import print_hi
hello

In [2]: print_hi()
hello

In [3]: from hello import print_hi

In [4]: import hello

In [5]: hello.print_hi()
hello


3行目と4行目のインポートは、1行目のインポートのように「hello」を出力しないことを確認してください。つまり、コードは再実行されません。

于 2012-06-07T17:42:58.073 に答える