In Python, ogni modulo possiede la variabile speciale __name__, il cui valore corrisponde ad una stringa assegnata dall'interprete dei comandi stesso.
Il valore assegnato dall'interprete può essere di due tipi:
- "__main__"
- "{nome_del_file}"
Il primo viene assegnato al modulo che viene eseguito, ossia quindi il file principale su cui viene lanciato Python (ad esempio sulla linea di comando "python nome_file.py")
Il secondo viene assegnato a tutti i moduli importati all'interno del modulo eseguito o all'interno di altri moduli importati.
Questo permette al programmatore di sapere sempre quale sia il modulo che è stato eseguito e dettarne il comportamento tramite un semplice if.
Immaginiamo di trovarci nel caso in cui sulla linea di comando eseguiamo "python File1.py", dove il contenuto di questo file è:
# File1.py
print ("File1 __name__ = "+__name__)
if __name__ == "__main__":
print ("File1 è il modulo eseguito")
else:
print ("File1 è un modulo importato")
Poiché abbiamo eseguito "python File1.py", l'output di questo programma sarà:
File1 __name__ = __main__
File1 è il modulo eseguito
Come vedi quindi la condizione del main risulta vera, quindi le istruzioni al suo interno vengono eseguite
Immaginiamo ora invece il caso in cui File1.py venga importato all'interno di File2.py:
# File2.py
import File1
print ("File2 __name__ = "+__name__)
if __name__ == "__main__":
print ("File2 è il modulo eseguito")
else:
print ("File2 è un modulo importato")
Una volta lanciato il comando "python File2.py", l'output sarà:
File1 __name__ = File1
File1 è un modulo importato
File2 __name__ = __main__
File2 è il modulo eseguito
Come puoi notare, nonostante il modulo File1 venga solo importato all'interno di File2, i suoi contenuti vengono comunque valutati dall'interprete di Python. Dunque, la condizione dell'if che abbiamo messo all'interno di File1 (nel caso in cui venga eseguito File2) viene comunque valutata e, poichè falsa, viene eseguita l'istruzione messa all'interno del suo else.
Nel caso in cui all'interno di File1.py non avessimo aggiunto quell'else, l'if sarebbe stato ignorato dall'interprete, poichè non vi è un set di istruzioni alternative (else) da eseguire.
Questo ci permette quindi, nel caso degli homework, di aggiungere delle istruzioni all'interno di "if __name__ == '__main__'" che possono essere eseguite dal nostro codice nel caso in cui noi stessi andassimo ad eseguire direttamente quel modulo, mentre esse vengono completamente ignorate dai test poichè ciò che realmente essi fanno è importare il nostro codice ed eseguire la funzione richiesta (solitamente la funzione ex). Per questo motivo, nel regolamento viene vietato di inserire istruzioni al di fuori di funzioni o al di fuori di quell.'if. poiché altrimenti esse verrebbero valutate dai test, creando possibili conflitti.
Se vuoi saperne di più puoi leggere questo articolo