Per chi programma in Python, potrà vedere all’interno di molti codici, soprattutto nella parte finale, il seguente costrutto:
if __name__ == "__main__":
seguito poi da una serie di istruzioni racchiuse nell’indentazione. A cosa serve? Perchè è tanto comune?
Prima di eseguire il codice, l’interprete Python legge il codice sorgente e definisce alcune variabili globali speciali, tra cui la variabile __name__ a cui viene assegnato il nome del modulo principale in esecuzione. Un modulo è un file contenente definizioni e dichiarazioni in Python. Il nome del file è il nome del modulo senza il suffisso .py.
Se l’interprete sta eseguendo quel modulo come programma principale (main), imposterà la variabile special __name__ ad avere un valore __main__. Se invece questo file viene importato da un altro modulo, allora __name__ verrà impostata con il nome del modulo.
Esempio
Vediamo un esempio diretto per comprendere al meglio la cosa. Scrivete il codice sottostante e salvatelo come aModule.py
print("This part is always executed") if __name__ == "__main__": print("This part is executed when this file is invoked directly.") else: print("This part is executed when this file is imported as module.")
Adesso vediamo come possiamo invocarli nei due casi.
$>python amodule.py
E nel secondo caso scrivete il codice sottostante e salvatelo come importModule.py
import aModule print("done")
Conclusioni
Come potete vedere nei due casi il comportamento è completamente diverso. Infatti, abbiamo definito un file .py come un “modulo“. Questo perché nel file abbiamo una parte del codice come classi e funzioni, che generalmente vengono sviluppate per essere riutilizzate altrove. Quindi con il costrutto visto nell’articolo è possibile utilizzare, o riutilizzare altrove, differenziandone il comportamento. Lasciando nel “main” locale, una parte dell’implementazione valida solo nel contesto del file visto da solo e non come modulo.