03: if __name__ == "__main__"

Python 3 - Lezioni su Concetti Intermedi

03: if __name__ == "__main__"

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 stia 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 e classi.

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