if __name__=="__main__" :

A
Allegretti (220 points)
1 2 3
asked Nov 9, 2021 in Programmare in Python by Allegretti (220 points)
edited Nov 11, 2021 by andrea.sterbini
Vorrei chiedere chiarimenti in merito alla funzione if __name__=="__main__"

1. in termini generali      2. in funzione dell'esecuzione degli HW

Grazie per la disponibilità
232 views

3 Answers

S
S3b4stian82 (2250 points)
3 6 27
answered Nov 9, 2021 by S3b4stian82 (2,250 points)

__name__ indica lo scope di esecuzione di uno script in python, è una variabile speciale.

- assume il valore __main__ nel momento in cui esegui direttamente uno script.

- assume come valore il nome del file quando il file è importanto come modulo all'interno di un'altro file.

Nel caso degli homework, quando il program01 viene richiamato dal test, la condizione della famosa if alla fine del file sarà falsa ed il codice in quel blocco sarà saltato perche il valora non sarà __main__, al contrario quando lo esegui direttamente dal terminale, non essendo il program01 importato, ma chiamato direttamente in causa, il valore sarà __main__, la condizione della if risulterà vera e le righe di codice verranno eseguite.

Puoi comunque anche consultare la bibbia per ulteriori approfondimenti: Documentazione ufficiale python

James_F (4580 points)
7 14 36
answered Nov 9, 2021 by James_F (4,580 points)

Non si tratta di una funzione, ma di uno strumento di controllo.
Python, come la maggior parte dei linguaggi, non si utilizza solo per singoli programmi, ma per sviluppare progetti complessi.
Come la maggior parte dei linguaggi di alto livello, inoltre, consente di costruirsi delle librerie personali con funzioni già pronte ed importarle dove serve (ragionamento esteso per il discorso dei progetti grandi).
Fai conto di avere un file "funzioni.py" che racchiude una serie di funzioni a te utili e ricorrenti in un progetto. Nel tuo ipotetico "progetto.py" potresti decidere di importare le funzioni lì presenti ''' import funzioni ''' oppure ''' from funzioni import funzione x '''.  Ora fai conto di avere un program01.py che è il tuo hw, i test fanno bene o male una cosa simile, ovvero importano dentro delle date strutture, il tuo codice (o meglio, le tue funzioni) e passano ad esse i dati da testare.

Il controllo if name main serve ad eseguire ciò che c'è scritto dentro quell'if solo se il programma è il principale, ovvero solo se hai eseguito tuoScript.py DIRETTAMENTE e non importandolo in altro.

Exyss (21390 points)
1 2 79
answered Nov 9, 2021 by Exyss (21,390 points)

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