Corso Python / Moduli e import: dividere il codice in più file
Un modulo è un’unità di codice Python riutilizzabile, spesso contenuta in un file .py. Importare un modulo significa cercarlo e inizializzarlo, non copiarne semplicemente il testo: contano la posizione dei file e le istruzioni eseguibili al livello principale.
Separare calcolo e programma chiamante
Metti la funzione di calcolo in expense_math.py e il codice che la usa in app.py, nella stessa cartella di esercitazione. Il primo file diventa un modulo che più programmi possono usare senza duplicare la definizione della funzione.
Usa nomi semplici con underscore, non trattini, per i moduli importati con la sintassi ordinaria. Evita nomi come json.py o csv.py: un file locale può nascondere il modulo della libreria standard che volevi importare. Non chiamare neppure un file con il nome di una libreria esterna che devi usare.
import expense_math associa il nome del modulo, e la funzione si raggiunge come expense_math.total. Con from expense_math import total ottieni direttamente il nome total, ma devi evitare di sovrascriverlo o confonderlo con altri nomi. La guida ufficiale ai moduli spiega le diverse forme di import.
Creare ed eseguire entrambi i file completi
Crea una cartella di esercitazione e salva in UTF-8 questi due file. Per expense_math.py usa:
def total(amounts):
return sum(amounts)
Per app.py usa:
import expense_math
print(expense_math.total([3500, 8000, 2500]))
Apri il terminale nella cartella che contiene entrambi i file, seleziona l’interprete del progetto ed esegui:
python app.py
Il risultato è 14000. Su macOS o Ubuntu fuori dall’ambiente virtuale usa python3 app.py se è il comando dell’interprete scelto. Non occorre installare pacchetti esterni: il modulo di calcolo è il file locale appena creato.
La chiamata riusa la funzione total; non stampa nulla quando il file della funzione viene semplicemente letto fino alla sua definizione. La stampa appartiene ad app.py, che qui è il programma eseguito. Le regole di definizione e chiamata delle funzioni restano le stesse anche quando il codice è diviso.
Capire ricerca, inizializzazione e cache
Il percorso di ricerca dipende dalla modalità di avvio, dall’interprete e dalla struttura del progetto. Per uno script eseguito con il percorso del file, la sua cartella entra normalmente nella ricerca dei moduli. Una chiamata da una sessione interattiva o da un altro punto d’ingresso può avere un contesto diverso. All’inizio usa la disposizione e il comando indicati per eliminare ambiguità.
Con ModuleNotFoundError, controlla prima nome esatto, estensione, cartella e interprete selezionato. Non modificare sys.path alla cieca e non copiare il sorgente nelle cartelle dell’installazione globale per risolvere un errore di disposizione dei file. La documentazione del sistema di importazione descrive ricerca e inizializzazione.
Le istruzioni al livello principale del modulo vengono eseguite durante il primo import in un processo. Input interattivo o operazioni sui dati in quel punto potrebbero dunque partire solo perché un altro programma importa il file. Racchiudi il lavoro riutilizzabile in funzioni e avvia le operazioni tramite un punto d’ingresso esplicito.
Un modulo importato è normalmente memorizzato nella cache del processo: importarlo di nuovo non riesegue semplicemente tutto il file. Dopo una modifica, riavvia il processo per verificarne il comportamento; salvare il file non aggiorna da solo un modulo già caricato in un interprete persistente.
La disposizione generica di due moduli può essere illustrata così:
practice/
main.py
helper.py
Qui main.py e helper.py sono soltanto nomi illustrativi. Per l’esercizio concreto conserva app.py e expense_math.py: app importa expense_math. Non rinominare i file con i nomi generici senza adattare anche il codice.
Verificare riuso e dipendenze circolari
- In app.py cambia 8000 in 9000: usando la stessa funzione il risultato diventa 15000. Ripristina poi 8000.
- Aggiungi temporaneamente una stampa fuori dalla funzione in expense_math.py. Avvia app.py in un nuovo processo: la stampa compare durante l’importazione, prima del totale. Rimuovila e verifica di nuovo il solo 14000.
- Se un import della libreria standard sembra caricare un file del progetto, controlla se il nome locale coincide con quello del modulo richiesto. Rinomina il file del progetto in modo descrittivo e riavvia il processo prima di riprovare.
Due moduli che si importano a vicenda possono chiedere un nome prima che la sua definizione sia stata eseguita, producendo un errore di inizializzazione parziale. Non ogni ciclo di dipendenze fallisce nello stesso modo, ma ridurne la necessità rende il progetto più facile da seguire: sposta il calcolo comune in un terzo modulo oppure stabilisci una direzione chiara fra le dipendenze.




