Python 3 - Lezioni su Concetti Intermedi

03: if __name__ == "__main__"



/div>

Ciao a tutti ragazzi e ragazze! In questa lezione spiegheremo il funzionamento di una delle righe di codice più comuni e spesso incomprese, nel mondo di Python! Mi riferisco a if __name__ == "__main__" !

 def main():
    pass

def print_tre_volte(parola):
    print(parola)
    print(parola)
    print(parola)

if __name__ == "__main__":
    main()
Abbiamo l'attributo __name__, che qualora corrisponda alla stringa "__main__" innesca la chiamata alla funzione main(). A cosa serve questa clausola di controllo? E perché si trova così spesso? Diamo anzitutto uno sguardo alla documentazione ufficiale Come leggiamo, questa riga consente al nostro codice di capire se sta venendo eseguito come script a se stante, o se è invece stato richiamato come modulo da un qualche programma per usare una o più delle sua varie funzioni. Possiamo immaginarlo visivamente come una sorta di punto d'ingresso o porta d'accesso al nostro programma. I vantaggi associati a questa informazione, quindi a sapere in che modo il nostro codice sta venendo eseguito sono molteplici e gli vedremo tra poco, ma prima è bene capire come fa esattamente a fare ció.
Quando Python esegue del codice, tra le prime cose che fa assegna alcune variabili speciali, tra cui troviamo anche la variabile __name__. Se Python si rende conto che sta eseguendo questo script direttamente, ad esempio tramite PyCharm o se lo avessimo richiamato da shell di sistema tipo:
 python script_a.py
in questi casi Python assegna alla variabile __name__ la stringa "__main__".
 print(__name__)
__main__
Quindi in questo caso la condizione di controllo risulta True, e la funzione ad essere richiamata e la main(), la funzione principale del programma, che contiene in sostanza le prime righe che vogliamo eseguire, ad esempio:
 def main():
    print("Prime righe da eseguire SOLO se lo script è stato lanciato 'come programma'")
    print("Lanciato automaticamente se a __name__ è assegnato __main__ ")

Se invece stiamo richiamando lo script come modulo da dentro a un altro programma, quindi abbiamo detto per usare funzioni come ad esempio la funzione print_tre_volte(), alla variabile __name__ verrà assegnato il nome dello script, quindi il nome del modulo:
#script_b

import script_a 

print(script_a.__name__)
>>> script_a
Possiamo ora comodamente richiamare le funzioni del nostro script_a:
 #script_b

import script_a

print(script_a.__name__)

script_a.print_tre_volte("asd")

>>> script_a
>>> asd
asd
asd
Ed ecco quindi svelato il mistero del funzionamento!
Tra i casi d'uso in cui questo puó tornare utile, c'è la possibilità di continuare a sviluppare del codice che vogliamo testare dall'interno, lasciando comunque la possibilità ad altri programmatori di utilizzare il resto delle nostre funzioni.
 def main():
    print("Codice da testare.")
    print("Prime righe da eseguire SOLO se lo script è stato lanciato 'come programma'")
    print("Lanciato automaticamente se a __name__ è assegnato __main__ ")

def print_tre_volte(parola):
    print(parola)
    print(parola)
    print(parola)

if __name__ == "__main__":
    main()

#script_a:

>>> Codice da testare.
Prime righe da eseguire SOLO se lo script è stato lanciato 'come programma'
Lanciato automaticamente se a __name__ è assegnato __main__

Quindi, per sintetizzare il tutto in una frase: Utilizziamo if __name__ == "__main__" in tutti quei casi in cui vogliamo che il nostro codice possa avere un doppio comportamento e utilizzo, sia come programma che come modulo. Happy Coding! :D



Menu della Serie