2012-06-07 2 views
9

Я создаю словарь из удаленной базы данных как часть моего запуска приложения. Этот процесс довольно тяжелый для ввода-вывода, поэтому я решил создать экземпляр «singleton» этого словаря и просто назвать его так, как это необходимо в моем приложении.Почему модуль python действует как одноэлементный?

Код выглядит как (в 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(), где это необходимо. Я добавил заявление на печать, чтобы проверить, была ли повторная инициализация или повторное использование state_code_dict, и я обнаружил, что он используется повторно (это функциональность, которую я хочу). Почему экземпляр state_code_dict выживает при запуске приложения?

Редактировать

импортировать функцию get_state_code_dict в нескольких файлах.

+0

потому что импортированный код выполняется только в первый раз? – KurzedMetal

+0

отредактирован для уточнения: я импортирую код в нескольких местах (несколько файлов включают функцию 'get_state_code_dict'. –

+1

Импорт кода, который уже загрузил интерпретатор, по умолчанию не будет повторно загружать этот код.Можно преднамеренно перезагрузить модуль, но если вам нужно это делать по какой-либо причине, кроме как из-за того, что фактический код модуля мог быть изменен во время выполнения, вам, вероятно, следует использовать иную иную программирование, чтобы делать то, что вы хотите сделать. –

ответ

16

Это описание питон Language Reference по how importing a module works:

(1) найти модуль, и инициализировать его при необходимости; (2) определить имя или имена в локальном пространстве имен

(курсив добавлен). Здесь, инициализации модуль означает выполнение своего кода. Это выполнение выполняется только , если необходимо, то есть если модуль ранее не был импортирован в текущий процесс. Поскольку модули Python являются первоклассными объектами времени выполнения, они эффективно становятся одноточиями, инициализированными во время первого импорта.

Обратите внимание, что это означает, что нет необходимости в функции get_state_dict_code; просто инициализировать state_code_dict на высшем уровне:

state_code_dict = generate_state_code_dict() 

Для более подробного описания работы см this talk by Thomas Wouters, особ. первая часть - около 04:20 - где он обсуждает принцип «все работает».

+0

+1 для упрощенного модульного модуля. –

+0

Буду ли я получить state_code_dict, вызвав словаря импорта, state_code_dict = Dictionaries.state_code_dict'? –

+0

@TylerDeWitt: да. Или идиоматическим 'из словарей import state_code_dict'. –

10

Я голосовал за 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, это означает, что код не выполняется повторно.

Смежные вопросы