2012-06-07 19 views
9

Creo un dizionario da un database remoto come parte dell'esecuzione della mia applicazione. Questo processo è piuttosto pesante di I/O, quindi ho deciso di creare un'istanza "singleton" di questo dizionario e chiamarla semplicemente come è necessaria nella mia applicazione.Perché un modulo Python si comporta come un singleton?

Il codice simile (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 

Ho poi importazione e chiamare la funzione get_state_code_dict() dove necessario. Ho aggiunto una dichiarazione di stampa per verificare se veniva reinizializzato o riutilizzato e ho trovato che era in fase di riutilizzo (che è la funzionalità che desidero). Perché l'istanza di state_code_dict è ancora in esecuzione?

Modifica

ho importare la funzione get_state_code_dict in più file.

+0

perché il codice importato viene eseguito solo la prima volta? – KurzedMetal

+0

modificato per chiarire: Importo il codice in più posizioni (più file includono la funzione 'get_state_code_dict'. –

+1

L'importazione del codice che l'interprete ha già caricato non ricaricherà il codice per impostazione predefinita.È possibile ricaricare deliberatamente un modulo, ma se lo si deve fare per qualsiasi ragione diversa dal fatto che il codice effettivo del modulo potrebbe essere cambiato durante il runtime, è consigliabile utilizzare un diverso linguaggio di programmazione per fare ciò che si vuole fare. –

risposta

16

Questa è la descrizione di Python di riferimento del linguaggio di how importing a module works:

(1) trovare un modulo, ed inizializzarlo se necessario; (2) definire un nome o nomi nello spazio dei nomi locale

(enfasi aggiunta). Qui, inizializzazione un modulo significa eseguire il suo codice. Questa esecuzione viene eseguita solo se necessario, ad esempio se il modulo non è stato precedentemente importato nel processo corrente. Poiché i moduli Python sono oggetti runtime di prima classe, diventano effettivamente singleton, inizializzati al momento della prima importazione.

Nota che ciò significa che non è necessaria la funzione get_state_dict_code; basta inizializzare state_code_dict a livello superiore:

state_code_dict = generate_state_code_dict() 

Per una spiegazione più approfondita, vedere this talk by Thomas Wouters, esp. la prima parte - intorno alle 04:20 - in cui discute il principio "tutto è tempo di esecuzione".

+0

+1 per l'idioma modulo-as-singleton semplificato. –

+0

Avrei quindi ottenuto lo state_code_dict chiamando 'Import Dizionari; state_code_dict = Dictionaries.state_code_dict'? –

+0

@TylerDeWitt: sì. O dall'idiomatico 'dai dizionari importa state_code_dict'. –

10

Ho votato come risposta larsman, volevo solo aggiungere un esempio.

hello.py:

hi = 'hello' 

print(hi) 

def print_hi(): 
    print(hi) 

sessione 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 


Guarda che le importazioni a linee 3 e 4 non emettono "ciao", come il import nella riga 1, significa che il codice non viene rieseguito.

Problemi correlati