A cosa serve l'istruzione if __name__ == '__main__' ?
L'interprete di Python, prima di eseguire il codice di qualsiasi file con estensione .py, assegna delle variabili "speciali", tra queste troviamo appunto __name__
.
Nel caso in cui il modulo viene eseguito come programma principale(come main), l'interprete assegnerà alla variabile __name__
la stringa "__main__"
; altrimenti gli verrà assegnato come valore il nome del file .py.
Valore di __name__ eseguendo un file come main
Iniziamo creando il file saluta.py
:
"""
saluta.py
"""
def salutami():
print("Ciao")
salutami()
print("__name__ = " + __name__)
Eseguiamolo e, oltre al risultato della funzione salutami, viene stampato a schermo il valore di __name__
, ovvero "__main__"
, proprio perché in questo caso abbiamo lanciato saluta.py
come main.
#output di saluta.py
Ciao
__name__ = __main__
Valore di __name__ di un modulo importato
Creiamo altro_script.py
e importiamo saluta.py
come modulo:
"""
altro_script.py
"""
import saluta
print("Dentro altro_script.py")
Importando saluta.py
come modulo, tutto il suo codice verrà eseguito appena verrà importato e noteremo che la variabile __name__
cambierà di valore:
#output di altro_script.py
Ciao
__name__ = saluta
Dentro altro_script.py
Utilizzo più comune di if __name__ == "__main__"
Per evitare l'esecuzione di tutto il codice del modulo importato, viene implementato un controllo sul __name__, per verificare se ha come valore "__main__" o altro.
Così facendo abbiamo la possibilità di cambiare il comportamento del nostro modulo in base a come viene eseguito(main o importato).
Nel nostro caso quindi vogliamo che il codice non venga eseguito se importato, perciò andremo a chiamare la nostra funzione solo se __name__
== "__main__"
:
"""
saluta.py
"""
def salutami():
print("Ciao")
if __name__ == "__main__":
salutami()
#output
Ciao
Importo saluta.py senza chiamare la funzione salutami()
:
"""
altro_script.py
"""
import saluta
print("Dentro altro_script.py")
#output
Dentro altro_script.py
Importo saluta.py e chiamo la funzione salutami()
:
"""
altro_script.py
"""
import saluta
print("Dentro altro_script.py")
saluta.salutami()
#output
Dentro altro_script.py
Ciao