Storia della questione
I Namespaces sono uno dei concetti fondamentali di Python, presenti sin dalle prime implementazioni del linguaggio. Servono a sistematizzare i nomi per evitare conflitti tra variabili, funzioni e classi di diverse parti del programma.
Problema
Nei grandi progetti emergono molte funzioni, classi, variabili e moduli. Senza un uso corretto dei namespaces, è possibile sovrascrivere nomi importanti, riscontrare ombre inattese di variabili e affrontare difficoltà durante il testing e l'espansione.
Soluzione
In Python, un namespace è una mappatura che collega nomi a oggetti. Ci sono diversi livelli di namespace: locale, globale, spazi dei moduli e di classi. Comprendere questa divisione garantisce un accesso corretto agli oggetti necessari e minimizza i conflitti.
Esempio di codice:
def foo(): x = 10 # x nello spazio dei nomi locale della funzione print(x) y = 20 # y nello spazio dei nomi globale del modulo foo() print(y)
Caratteristiche chiave:
Cosa succede se nella stessa funzione dichiari una variabile locale con lo stesso nome di una globale?
La locale "sovrascriverà" la globale durante l'esecuzione della funzione; fuori dalla funzione, la globale rimarrà invariata.
a = 1 def test(): a = 2 print(a) # 2 test() print(a) # 1
Come ottenere un elenco di tutti i nomi nello spazio dei nomi corrente?
Le funzioni locals(), globals(), dir() restituiscono le rispettive mappature o elenchi di nomi nella corrente area di visibilità/namespace.
Qual è la differenza tra gli spazi dei nomi delle classi e delle istanze?
Il namespace della classe definisce gli attributi comuni a tutte le istanze della classe. Il namespace dell'istanza include attributi specifici per un particolare oggetto. Le modifiche nell'istanza non influenzano la classe e viceversa.
Abbiamo usato from mymodule import * in tutte le parti di un grande progetto. Alla fine, i nomi delle funzioni sono stati sovrascritti, sono emersi bug difficili da rilevare a causa dei conflitti di nomi tra pacchetti.
Vantaggi:
Svantaggi:
Siamo passati agli alias di importazione (import mymodule as mm), chiara strutturazione dei moduli.
Vantaggi:
Svantaggi: