Que fait if __name__ == "__main__":
?
Pour résumer les bases :
-
La variable globale __name__
dans le module qui est le point d'entrée de votre programme est '__main__'
. Sinon, c'est le nom par lequel vous importez le module.
-
Ainsi, le code sous le bloc if
ne s'exécutera que si le module est le point d'entrée de votre programme.
-
Cela permet au code du module d'être importable par d'autres modules sans exécuter le bloc de code en dessous à l'importation.
Pourquoi avons-nous besoin de cela ?
Développement et test de votre code
Disons que vous écrivez un script Python conçu pour être utilisé comme un module :
def do_important():
"""Cette fonction fait quelque chose de très important"""
Vous pourriez tester le module en ajoutant cet appel de fonction à la fin :
do_important()
et en l'exécutant (dans une invite de commande) avec quelque chose comme :
~$ python important.py
Le problème
Cependant, si vous voulez importer le module dans un autre script :
import important
Lors de l'importation, la fonction do_important
serait appelée, donc vous auriez probablement commenté votre appel de fonction, do_important()
, en bas.
# do_important() # Je dois me rappeler de décommenter pour exécuter ceci!
Et vous devrez alors vous rappeler si vous avez commenté ou non votre appel de la fonction de test. Et cette complexité supplémentaire signifierait que vous êtes susceptible d'oublier, rendant votre processus de développement plus difficile.
Une meilleure façon
La variable __name__
pointe vers l'espace de noms où l'interpréteur Python se trouve à ce moment.
À l'intérieur d'un module importé, c'est le nom de ce module.
Mais à l'intérieur du module principal (ou d'une session interactive Python, c'est-à-dire la boucle de lecture, d'évaluation, d'impression ou REPL de l'interpréteur), vous exécutez tout depuis son "__main__"
.
Donc si vous vérifiez avant d'exécuter :
if __name__ == "__main__":
do_important()
Avec ce qui précède, votre code ne s'exécutera que lorsque vous l'exécutez en tant que module principal (ou l'appelez intentionnellement depuis un autre script).
Une façon encore meilleure
Il y a une manière plus pythonique d'améliorer cela cependant.
Et si nous voulons exécuter ce processus métier depuis l'extérieur du module ?
Si nous mettons le code que nous voulons exécuter lors du développement et du test dans une fonction comme ceci, et ensuite effectuons notre vérification pour '__main__'
immédiatement après :
def main():
"""logique métier pour l'exécution de ce module en tant que principal !"""
setup()
foo = do_important()
bar = do_even_more_important(foo)
for baz in bar:
do_super_important(baz)
teardown()
# Voici notre idiome de paiement !
if __name__ == '__main__':
main()
Nous avons maintenant une fonction finale pour la fin de notre module qui s'exécutera si nous exécutons le module en tant que module principal.
Cela permettra au module et à ses fonctions et classes d'être importés dans d'autres scripts sans exécuter la fonction main
, et permettra également d'appeler le module (et ses fonctions et classes) lors de l'exécution à partir d'un autre module '__main__'
, c'est-à-dire
import important
important.main()
Cet idiome se trouve également dans la documentation Python dans une explication du module __main__
. Ce texte déclare :
Ce module représente la portée (autrement anonyme) dans laquelle le programme principal de l'interpréteur s'exécute - commandes lues soit à partir de l'entrée standard, depuis un fichier de script, ou depuis une invite interactive. C'est cet environnement dans lequel le strophe idiomatique "script conditionnel" fait exécuter un script :
if __name__ == '__main__':
main()
43 votes
Juste pour information - qu'est-ce que "main": docs.python.org/3/reference/… et qu'est-ce que "name": docs.python.org/3/reference/…
22 votes
Combien d'entre vous sont venus ici parce que vous voulez copier-coller 'if __name__ == "__main__":'? :-P
5 votes
Il est utile si vous voulez écrire du code Python qui est destiné à être "importé" mais qui peut également être exécuté en tant que script shell autonome. Le code protégé par la vérification
if __name__
ne s'exécute que lorsqu'il est invoqué en tant que commande, pas lorsqu'il est importé. C'est aussi utile si vous voulez déboguer un script Python en utilisant une session Python interactive. Vous pouvez "importer" du code qui est normalement exécuté en tant que commande dans une session interactive, puis saisir manuellement du code pour exécuter des fonctions/classes dans le script comme vous le souhaitez.4 votes
À toute personne arrivant ici, [7:32] Vous devriez insérer ceci dans tous vos scripts Python | if __name__ == '__main__': ... par la chaîne YouTube mCoding fournit une excellente explication et discussion des conséquences de cet idiome. Le titre est probablement trop prescriptif pour SO, mais l'explication est bonne.