In Python spazio dei nomi (namespace) è un dizionario che associa nomi e oggetti. Livelli degli spazi dei nomi: locale, globale, incorporato. I moduli sono spazi separati per organizzare il codice. Durante l'importazione, Python crea un nuovo spazio dei nomi per ogni modulo.
import module — importa il modulo e accede agli oggetti tramite module.name.from module import name — importa un oggetto dal modulo direttamente nello spazio corrente (rischio di conflitti di nomi).as — consente di assegnare un alias.Per evitare conflitti di nomi:
import mymodule), piuttosto che l'asterisco (from... import *).__init__.py).import module as m).project/
package/
__init__.py
module1.py
module2.py
import package.module1 from package.module2 import function as fn
Domanda: Qual è la differenza nell'importare un modulo due volte? Verrà eseguito nuovamente tutto il codice del modulo?
Risposta: No. Al primo import, il modulo viene eseguito e il risultato viene memorizzato in sys.modules. L'importazione successiva restituisce già l'oggetto del modulo caricato, il suo codice non viene eseguito di nuovo.
# module.py print('Hello!') # main.py import module # stamperà Hello! import module # non stamperà nulla
Storia
from settings import * in diversi moduli, con il risultato che quando le impostazioni venivano modificate, le variabili locali venivano "sovrascritte" inaspettatamente, causando bug difficili da individuare.Storia
utils.py). Durante l'integrazione, i moduli con nomi "simili" si "sostituivano" a vicenda, portando a comportamenti inaspettati e bug complicati.Storia
In una delle librerie, tentarono di "riimportare al volo" un modulo con nuove impostazioni tramite importlib.reload. Non tennero conto che i moduli già importati avevano mantenuto i riferimenti ai vecchi oggetti, il che portò a modifiche non applicabili in tutte le parti dell'applicazione.