6.12 L'istruzione import

import_stmt  ::=  "import" module ["as" name] ( "," module ["as" name] )*
    | "from" module "import" identifier ["as" name]
      ( "," identifier ["as" name] )*
    | "from" module "import" "*"
module  ::=  (identifier ".")* identifier
Potete scaricare il file originale (in Inglese) come testo.

Le istruzioni import vengono eseguite in due passi: (1) cercare un modulo, ed inizializzarlo se necessario; (2) definire un nome o nomi nello spazio dei nomi locale (nel medesimo ambito di visibilità in cui viene eseguita l'istruzione import). La prima forma (senza from) ripete questi passi per ogni identificatore nella lista. La forma con from) svolge il passo (1) una volta e quindi svolge ripetutamente il passo 2.

In questo contesto, per ``inizializzare'' una built-in, un modulo estensione significa chiamare una funzione di inizializzazione che deve essere fornita dal modulo per l'uso (nelle implementazioni di riferimento, il nome della funzione è ottenuto antecedendo la stringa ``init'' al nome del modulo); per ``inizializzare'' un modulo codificato Python significa eseguire il corpo del modulo.

Il sistema mantiene una tavola dei moduli che sono stati o saranno inizializzati, indicizzandoli per nome. Questa tavola è accessibile come sys.modules. Quando il nome di un modulo viene trovato in questa tavola, il passo (1) è finito. Altrimenti, inizia la ricerca per la definizione di un modulo. Quando un modulo è stato trovato, viene caricato. Dettagli della ricerca di moduli e dei processi di caricamento sono implementazioni specifiche delle diverse piattaforme. Questo di solito comporta la ricerca per un modulo ``built-in'' con un dato nome e quindi la ricerca di una lista di posizione data come sys.path.

Se viene trovato un modulo built-in, il suo codice di inizializzazione built-in viene eseguito ed il passo (1) è terminato. Se non ci sono file che hanno corrispondenze, viene sollevata un'eccezione ImportError. Se viene trovato un file, viene analizzato, restituendo un blocco di codice eseguibile. Se avviene un errore di sintassi, viene sollevata un'eccezione SyntaxError. Altrimenti, viene creato un modulo vuoto con un dato nome ed inserito nella tavola dei moduli, e quindi viene eseguito il blocco di codice nel contesto di questo modulo. Eccezioni durante questa esecuzione terminano il passo (1).

Quando il passo (1) finisce senza avere sollevato eccezioni, il passo (2) può iniziare.

La prima forma dell'istruzione import collega il nome del modulo nello spazio dei nomi locale all'oggetto modulo, e quindi va ad importare il prossimo identificatore, se c'è nè qualcuno. Se il nome del modulo viene seguito da as, il nome successivo ad as viene usato come spazio dei nomi locale per il modulo.

La forma from non collega il nome del modulo: attraversa la lista degli identificatori, guarda in ognuno di loro con riguardo al modulo trovato al passo (1) e collega il nome allo spazio dei nomi locale all'oggetto così trovato. Come con la prima forma di import, un nome locale alternativo può essere fornito specificndo "as nome locale". Se un nome non viene riscontrato, viene sollevata un'eccezione ImportError. Se la lista degli identificatori viene sostituita da una stella ("*"), tutti i nomi pubblici definiti nel modulo vengono legati allo spazio dei nomi locale dell'istruzione import.

I nomi pubblici definiti da un modulo vengono determinati dalla ricerca nello spazio dei nomi dei moduli per una variabile chiamata __all__; se definita, deve essere una sequenza di stringhe che rappresentano nomi definiti o importati da quel modulo. I nomi dati in __all__ vengono considerati pubblici e sono necessari perché esistano. Se __all__ non viene definito, la gamma dei nomi pubblici include tutti i nomi trovati nello spazio dei nomi del modulo che non iniziano con un carattere di sottolineatura ("_"). __all__ dovrebbe contenere l'intera API pubblica. Questo viene inteso per evitare l'esportazione accidentale di elementi che non sono parte dell'API (come moduli della libreria che erano stati importati e usati senza il modulo).

La forma from con "*" può solo trovarsi nell'ambito di visibilità del modulo. Se la forma di import col carattere jolly -- "import *" -- viene usata in una funzione e la funzione contiene o è un blocco annidato con variabili libere, il compilatore solleverà un'eccezione SyntaxError.

Nomi dei moduli gerarchici: quando il nome dei moduli contiene uno o più punti, il percorso di ricerca del modulo viene effettuato differentemente. La sequenza di identificatori sopra l'ultimo punto viene usata per trovare un ``package''; l'identificatore finale viene quindi cercato all'interno del package. Un package è generalmente una sottodirectory di una directory su sys.path che ha un file __init__.py.. [XXX Non può si può parlare di questo ora: vedere l'URL http://www.python.org/doc/essays/packages.html per maggiori dettagli, anche su come la ricerca dei moduli lavora dall'interno di un package.]

La funzione built-in __import__() viene fornita per supportare applicazioni che determinano quali moduli necessitano di essere caricati dinamicamente; riferirsi a Funzioni built-in nel La libreria di riferimento di Python per ulteriori informazioni.



Subsections
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.