Prima di spiegare qualcosa a riguardo if __name__ == '__main__'
è importante capire cosa __name__
è e cosa fa.
Che cosa è __name__
?
__name__
è un DunderAlias - può essere pensato come una variabile globale (accessibile dai moduli) e funziona in modo simile a global
.
È una stringa (globale come menzionato sopra) come indicato da type(__name__)
(cedimento <class 'str'>
), ed è uno standard integrato per entrambe le versioni Python 3 e Python 2 .
Dove:
Non può essere utilizzato solo negli script, ma può anche essere trovato sia nell'interprete che nei moduli / pacchetti.
Interprete:
>>> print(__name__)
__main__
>>>
script:
test_file.py :
print(__name__)
Con il risultato di __main__
Modulo o pacchetto:
somefile.py:
def somefunction():
print(__name__)
test_file.py:
import somefile
somefile.somefunction()
Con il risultato di somefile
Si noti che quando utilizzato in un pacchetto o modulo, __name__
prende il nome del file. Il percorso del modulo attuale o del percorso del pacchetto non è indicato, ma ha i propri DunderAlias __file__
, che lo consentono.
Si dovrebbe notare che, dove __name__
, dove è il file principale (o programma) sarà sempre tornare __main__
, e se si tratta di un modulo / package, o tutto ciò che è in esecuzione fuori qualche altro script Python, restituirà il nome del file in cui si è originario di.
Pratica:
Essere una variabile significa che il suo valore può essere sovrascritto ("can" non significa "dovrebbe"), la sovrascrittura del valore __name__
comporterà una mancanza di leggibilità. Quindi non farlo, per qualsiasi motivo. Se hai bisogno di una variabile, definisci una nuova variabile.
Si presume sempre che il valore di __name__
essere __main__
o il nome del file. Ancora una volta, la modifica di questo valore predefinito causerà maggiore confusione sul fatto che farà del bene, causando ulteriori problemi in futuro.
esempio:
>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>
È considerata buona pratica in generale includere gli if __name__ == '__main__'
script in.
Ora per rispondere if __name__ == '__main__'
:
Ora sappiamo che il comportamento delle __name__
cose diventa più chiaro:
An if
è un'istruzione di controllo del flusso che contiene il blocco di codice verrà eseguito se il valore fornito è vero. Abbiamo visto che __name__
può assumere uno
__main__
o il nome del file da cui è stato importato.
Ciò significa che se __name__
è uguale a __main__
allora il file deve essere il file principale e deve essere effettivamente in esecuzione (o è l'interprete), non un modulo o pacchetto importato nello script.
Se effettivamente __name__
prende il valore di __main__
allora, tutto ciò che è in quel blocco di codice verrà eseguito.
Questo ci dice che se il file in esecuzione è il file principale (o se si esegue direttamente dall'interprete), tale condizione deve essere eseguita. Se è un pacchetto, non dovrebbe esserlo e il valore non lo sarà __main__
.
moduli:
__name__
può anche essere usato nei moduli per definire il nome di un modulo
varianti:
È anche possibile fare altre cose meno comuni ma utili __name__
, alcune che mostrerò qui:
Esecuzione solo se il file è un modulo o pacchetto:
if __name__ != '__main__':
# Do some useful things
Esecuzione di una condizione se il file è quello principale e un'altra in caso contrario:
if __name__ == '__main__':
# Execute something
else:
# Do some useful things
È inoltre possibile utilizzarlo per fornire funzioni / utilità di guida eseguibili su pacchetti e moduli senza l'uso elaborato delle librerie.
Inoltre, consente di eseguire i moduli dalla riga di comando come script principali, che possono anche essere molto utili.
if __name__ == "__main__":
condizioni di blocco sono state deprecate / obsolete per quanto riguarda Python 3? Ho trovato alcune informazioni che lo affermano.