
Moduli ibridi in Python
Quando parliamo di "moduli ibridi" in Python ci riferiamo a file che possono essere eseguiti come script oppure importati come collezione di classi e di funzioni.
Come si crea un modulo ibrido? Il trucco per creare un modulo ibrido risiede nell'uso di un blocco condizionale che verifica se il file è stato eseguito direttamente o importato. Questo si fa controllando il valore dell'attributo "__name__" del modulo.
Il comportamento dell' attributo "__name__" varia in base al modo in cui il file viene utilizzato:
- Quando il file è eseguito direttamente come script, il valore di questo attributo è automaticamente impostato su "__main__"
- Quando il file è importato come modulo, invece, il valore di questo attributo corrisponde al nome del file modulo stesso senza l'estensione ".py".
Usando questa distinzione, puoi decidere quali parti del codice eseguire. In altre parole, puoi scrivere un codice che si comporti in modo diverso a seconda del contesto.
Un esempio pratico
Immaginiamo di avere un modulo che, tra le altre cose, può calcolare il fattoriale di un numero.
Vogliamo che il calcolo del fattoriale sia eseguito se il modulo viene eseguito come script, ma non vogliamo che ciò avvenga automaticamente se il modulo viene importato da un altro script.
def calcola_fattoriale(n):
"""Calcola il fattoriale di un numero n."""
if n < 0:
return None
risultato = 1
for i in range(1, n + 1):
risultato *= i
return risultato
def main():
numero = int(input("Inserisci un numero per calcolare il suo fattoriale: "))
risultato = calcola_fattoriale(numero)
print(f"Il fattoriale di {numero} è {risultato}")
if __name__ == "__main__":
main()
Salva questo codice in un file chiamato "fattoriale.py".
Vediamo come cambia il funzionamento del modulo a seconda delle circostanze:
1] Esegui lo script
Quando esegui questo file come script, l'attributo __name__ del modulo assume il valore "__main__".
Il codice rileva questa condizione attraverso un blocco condizionale ed esegue automaticamente la funzione main().
Di conseguenza, viene visualizzata una richiesta sullo schermo che invita l'utente a digitare un numero, dopodiché il programma elabora e visualizza il fattoriale del numero inserito.
Inserisci un numero per calcolare il suo fattoriale:
2] Importa il modulo
Ora prova a importare lo stesso file tramite l'istruzione import, indicando il nome del file senza l'estensione ".py".
import fattoriale
In questa situazione, l'attributo __name__ contiene il nome del modulo.
Il blocco condizionale non identifica il valore "__main__", pertanto non invoca la funzione main().
Di conseguenza, il complesso delle funzioni viene memorizzato senza che il modulo sia effettivamente eseguito. Questo significa che non viene sollecitata alcuna azione da parte dell'utente, come l'inserimento di un numero."
Ad esempio, dopo aver importato il modulo puoi richiamare la funzione calcola_fattoriale() dalla riga comandi o da un altro script.
>>> import fattoriale
>>> fattoriale.calcola_fattoriale(5)
120
E' un esempio tipico di modulo ibrido perché funziona in modo diverso a seconda di come lo utilizzi.
Perché i moduli ibridi sono utili?
Un modulo ibrido ti permette di usare lo stesso file sia come modulo riutilizzabile che come script stand-alone.
Questo è particolarmente utile se vuoi creare delle librerie che possono anche fungere da applicazioni autonome.
Ad esempio, le funzioni che hai sviluppato in uno script possono essere importate ed utilizzate indipendentemente dallo script stesso, mantenendo la loro utilità in diversi contesti. In questo modo puoi riutilizzare lo stesso codice ed è più facile fare la manutenzione perché la base di codice è organizzata in un modulo ed è più efficiente.
Grazie a questa tecnica puoi strutturare i tuoi progetti Python rendendoli più modulari, riutilizzabili e facili da mantenere.