4.1 Nomi e Associazioni

I Nomi si riferiscono agli oggetti e vengono introdotti da operazioni di associazione. Ogni occorrenza di un nome nel testo di un programma fa riferimento all'associazione di tale nome, stabilita all'interno del blocco funzionale che lo usa.

Un blocco è una parte di un programma Python che viene eseguito come una singola unità. Esempi di blocchi sono: un modulo, il corpo di una funzione, una definizione di classe. Ogni comando scritto in modalità interattiva è un blocco. Un file di script (un file passato come standard input all'interprete o specificato come primo parametro sulla riga di comando dell'interprete) è un blocco di codice. Un comando di script (un comando specificato sulla riga di comando dell'interprete con l'opzione `-c') è un blocco di codice. Un file letto dalla funzione predefinita execfile() è un blocco di codice. L'argomento di tipo stringa passato alla funzione predefinita eval() e all'istruzione exec è un blocco di codice. L'espressione letta e valutata dalla funzione predefinita input() è un blocco di codice.

Un blocco di codice viene eseguito all'interno di una cornice di esecuzione. Una cornice contiene delle informazioni amministrative (utilizzate per il debug) e determina dove ed in che modo l'esecuzione può continuare una volta terminata l'esecuzione del blocco di codice corrente.

Lo scope (NdT: campo, ambito di visibilità) definisce la visibilità di un nome all'interno di un blocco. Se una variabile locale viene definita in un blocco, il suo ambito di visibilità è quel blocco. Se una definizione viene fatta all'interno di un blocco funzionale, il campo si estende a tutti i blocchi contenuti all'interno di quello in cui è stata realizzata la definizione, a meno che uno dei blocchi contenuti non assegni un oggetto differente allo stesso nome. Il campo di un nome definito all'interno di un blocco di tipo classe è limitato a tale blocco; non si estende ai blocchi di codice dei suoi metodi.

Quando un nome viene utilizzato in un blocco di codice, questo viene risolto all'interno del campo più vicino che lo racchiude. L'insieme di tutti questi ambiti di visibilità di un blocco di codice vengono definiti come l'ambiente del blocco di codice.

Se un nome è legato ad un blocco, è una variabile locale di quel blocco. Se un nome è legato a livello di modulo, è una variabile globale. (Le variabili del blocco di codice di tipo modulo sono locali e globali.) Se una variabile viene usata in un blocco di codice ma non viene definita in tale blocco, viene chiamata variabile libera.

Quando un nome non viene trovato affatto, viene sollevata un'eccezione NameError. Se il nome si riferisce ad una variabile locale che non è stata associata, viene sollevata un'eccezione UnboundLocalError. UnboundLocalError è una sottoclasse di NameError.

I seguenti costrutti collegano i nomi: parametri formali a funzioni, istruzioni import, classi e definizioni di funzioni (queste collegano il nome della classe o della funzione nel blocco definito), obiettivi che rappresentano identificatori se trovati in un assegnamento, cicli for di intestazioni o nella seconda posizione in un'intestazione di una clausola except. L'istruzione import nella forma ``"from ...import *"'', collega tutti i nomi definiti nel modulo importato, ad eccezione di quelli che iniziano con un carattere di sottolineatura. Questa forma può essere usata solo a livello di modulo.

Un obiettivo trovato in una dichiarazione del viene considerato collegato a quella funzione (sebbene le semantiche attuali svincolino il nome). È illegale svincolare un nome che si riferisce ad un campo collegato; il compilatore riporterà un SyntaxError.

Ogni assegnazione o istruzione import avverrà all'interno di un blocco definito da una definizione di classe o funzione o a livello del modulo (il blocco di codice al livello più alto).

Se un nome che collega una operazione si presenta all'interno di un blocco di codice, tutti gli usi del nome all'interno del blocco verranno trattati come riferimenti al blocco corrente. Questo può condurre ad errori quando un nome viene usato all'interno di un blocco prima che questo venga collegato. Questa regola è subdola. Python manca di dichiarazioni e consente operazioni di collegamento di nomi ovunque all'interno di un blocco di codice. Le variabili locali di un blocco di codice possono essere determinate dalla scansione dell'intero testo del blocco per le operazioni di collegamento dei nomi.

Se l'istruzione globale avviene all'interno di un blocco, tutti gli usi del nome specificato nell'istruzione si riferiscono al collegamento di quel nome nello spazio dei nomi di alto livello. I nomi vengono risolti nello spazio dei nomi di alto livello, ricercandoli nello spazio dei nomi globale, per esempio lo spazio dei nomi del modulo che contiene il blocco di codice e lo spazio dei nomi built-in, lo spazio dei nomi del modulo __builtin__. Viene ricercato prima nello spazio dei nomi globale. Se il nome non viene trovato lì, viene cercato nello spazio dei nomi built-in. La dichiarazione globale deve precedere tutti gli usi del nome.

Lo spazio dei nomi built-in, associato all'esecuzione di un blocco di codice si trova attualmente cercando il nome __builtins__ nel suo spazio dei nomi globale; questo dovrebbe essere un dizionario o un modulo (nel caso di lettere viene usato il dizionario dei moduli). Normalmente, lo spazio dei nomi __builtins__ è il dizionario del modulo built-in __builtin__ (notare: senza `s'). Se non c'è, viene attivata una modalità di esecuzione limitata.

Lo spazio dei nomi per il modulo viene creato automaticamente la prima volta che il modulo viene importato. Il modulo principale per uno script viene chiamato sempre __main__.

La dichiarazione globale ha la stessa capacità dell'operazione di collegamento dei nomi nello stesso blocco. Se il più vicino ambito di visibilità per una variabile libera contiene una dichiarazione globale, la variabile libera viene trattata come una globale.

Una definizione di classe è una dichiarazione eseguibile che può essere usata e definire nomi. Questi riferimenti seguono le normali regole per le definizione dei nomi. Lo spazio dei nomi della definizione di classe diventa l'attributo dizionario della classe. I nomi definiti per l'uso della classe non sono visibili nei metodi.



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