ProgrammazioneSviluppatore Backend

Racconta cosa succede quando importi un modulo in Python. Come Python ricerca e carica i moduli? Quali errori tipici si possono fare con una gestione scorretta dell'import?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

Quando in Python avviene l'importazione di un modulo, l'interprete lo cerca nelle directory elencate in sys.path. Prima cerca tra i moduli standard, poi tra i file .py, .pyc e le cartelle con il file __init__.py (pacchetti).

  1. Se il modulo è già stato importato, l'importazione successiva lo preleva semplicemente da sys.modules.
  2. Se il modulo non viene trovato nei percorsi standard, verrà sollevata un'eccezione ModuleNotFoundError.
  3. Durante l'importazione, il modulo viene tradotto in bytecode (.pyc) e memorizzato nella cache (se ci sono diritti di scrittura).

Esempio:

# mypkg/__init__.py (può essere vuoto) # mypkg/mod.py # main.py import mypkg.mod
  • Il nome del file, la struttura delle directory, la presenza/assenza di __init__.py (per Python <3.3 obbligatorio) — tutto conta.

Come cerca:

  • Prima l'import assoluto.
  • Poi — ricerca nelle directory sys.path (la directory dello script corrente viene sempre per prima).
  • Nei pacchetti il contesto è importante (from . import ..., import assoluto/relativo).

Domanda insidiosa.

Cosa succede se nella directory con il tuo script c'è un file di nome random.py e provi a importare il modulo standard random?

Risposta:

Viene importato IL MIO file locale random.py, non la libreria standard. Una causa comune di bug difficili da identificare — conflitti tra i nomi dei moduli e le librerie (shadowing). Bisogna prestare attenzione alla denominazione dei file.

Esempi di errori reali dovuti alla mancanza di conoscenza delle sottigliezze dell'argomento.


Storia

In un grande progetto, il modulo email.py ha accidentalmente oscurato il modulo standard email dalla libreria, e gli sviluppatori non riuscivano a capire perché le funzioni di parsing della posta da librerie esterne non funzionassero.


Storia

In un progetto ML, la funzione os.path non funzionava: accanto allo script principale c'era un file os.py, che intercettava tutte le chiamate al modulo standard. Hanno passato un mese a fare debug, fino a trovare il conflitto di nomi.


Storia

In un'API REST microservizi sono emersi import ciclici nel tentativo di fare un'importazione relativa dei modelli tra diversi sottopacchetti. Hanno risolto il problema solo dopo aver rifattorizzato la struttura del progetto e stabilito un ordine esplicito di caricamento dei moduli.