Imparare Python da zero – #02 – Moduli, import e variabile __name__

Un programma Python, a differenza di quasi tutti gli altri linguaggi di programmazione, non ha un metodo main da cui parte la sue esecuzione. Quando viene eseguito un modulo Python, l’interprete inizia ad eseguire il codice che trova al livello di indentazione 0.

Creiamo un semplice modulo e proviamo ad eseguirlo da linea di comando:

Python module

Come vediamo l’esecuzione parte dal codice a livello 0 di indentazione.

Quando un modulo viene mandato in esecuzione direttamente, l’interprete setta una variabile speciale chiamata __name__ al valore __main__

Questo si può verificare modificando il nostro semplice esempio come segue:

Python __name__ variable

Tramite l’invocazione da shell del comando python però, non è l’unico modo in cui un modulo può essere eseguito. Un altro modo è tramite import. Quando un modulo viene importato in un altro modulo esso viene mandato in esecuzione dall’interprete direttamente dallo statement di import.
Vediamo un esempio. Creiamo 2 diversi moduli, un primo file che chiamiamo python-02.py

import python_2_modulo

def mia_funzione():
    print("Dentro la funzione")

print("Inizio programma")
print(4 + 5)
print(__name__)

ed un secondo file che chiamiamo python_2_modulo.py

def funzione_nel_modulo():
	print("siamo qua")

print("modulo importato")
funzione_nel_modulo()

Come vediamo il primo modulo importa il secondo. Provando ad eseguire il modulo python-02.py otteniamo il seguente risultato:
Python modules import example

Dall’output generato dall’esecuzione vediamo che gli statement del modulo importato vengono eseguiti prima del modulo mandato in esecuzione da shell. Questo perchè, come detto, lo statement di import manda direttamente in esecuzione il modulo importato.
Proviamo ad aggiungere anche nel modulo “python_2_modulo.py” la stampa della variabile speciale __name__

def funzione_nel_modulo():
	print("siamo qua")

print("modulo importato")
funzione_nel_modulo()
print(__name__)

Il risultato di questa nuova esecuzione è mostrato nella figura seguente:
Python modules import __name__ variable

In questo caso, come valore della variabile __name__ nel modulo importato, viene stampato il valore “python_2_modulo“. Questo perchè il modulo è stato importato e non eseguito direttamente come modulo principale.

La variabile speciale __name__ assume quindi i valori:
__main__ se il modulo viene eseguito direttamente
il nome del modulo se il modulo non è eseguito direttamente ma è importato da un altro modulo

Questo ci permette di determinare, all’interno di un modulo, quello che vogliamo che venga eseguito sempre e quello che eventualmente vogliamo sia eseguito solo quando il modulo viene eseguito come modulo principale.
Vediamo un altro esempio. Modifichiamo il modulo “python_2_modulo.py” inserendo il controllo, a livello di indentazione 0, che la variabile __name__ sia uguale a “__main__”. In questo modo diciamo al modulo di eseguire gli statement che costituiscono il ramo if solo nel caso in cui il modulo stesso sia eseguito direttamente e di saltarle invece nel caso in cui esso sia importato in un altro modulo.

def funzione_nel_modulo():
	print("siamo qua")

if __name__ == "__main__":
	print("modulo importato")
	funzione_nel_modulo()
	print(__name__)

Modifichiamo anche il modulo “python-02.py” inserendo una chiamata alla funzione “funzione_nel_modulo()” definita nel file “python_2_modulo.py”.

import python_2_modulo

def mia_funzione():
    print("Dentro la funzione")

print("Inizio programma")
print(4 + 5)
print(__name__)
python_2_modulo.funzione_nel_modulo()

Eseguendo nuovamente il modulo “python-02.py” da linea di comando otteniamo:

Python check on __name__ variable

In questo caso, come ci aspettavamo, il modulo viene importato per cui le funzioni in esso definito sono disponibili al modulo “chiamante”, ma il codice inserito nel blocco if non viene eseguito. Questo perché la variabile __name__ viene valorizzata con il nome del modulo e non con il valore “__main__”, essendo esso stato importato e non eseguito direttamente.

Ci sono un paio di cose che dobbiamo notare nel codice dei due moduli di esempio che abbiamo scritto:
– Quando si importa un modulo occorre fornire il suo nome senza indicare l’estensione .py . In caso contrario si otterrà un errore:
Python module import error
– Per invocare una funzione definita in un modulo importato occorre utilizzare la sintassi nome_del_modulo.funzione()
Anche qui, se non si utilizza la sintassi corretta, si ottiene errore:
Python function invocation error

Leave a Reply

Your email address will not be published. Required fields are marked *