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


Condividi sui Social