Pourquoi if __name__ == '__main__' en Python ?


if __name__ == '__main__' est un un idiome qu’on voit souvent dans les scripts Python.

A quoi sert-il ?

Contrairement à d’autres langages comme le C, le Java ou le C#, Python n’a pas de fonction ou méthode main(). Quand on lance un script, tout le script est exécute dans tous les cas, et aucune fonction n’est appelée automatiquement.

Normalement c’est plutôt une bonne chose. Explicite is better than implicit, tout ça.

Mais cela pose un problème quand on a un script qui contient du code que l’on souhaite exécuter quand on lance le script directement, mais pas quand on l’importe dans un autre script.

Par exemple, un script egouts.py qui ne fait rien d’intéressant (mais qui le fait vachement bien):

 
def tortues():
    print "kawabunga"
 
tortues()

Si on fait python egouts.py, ça va lancer tortues(). Si on fait dans un autre script import egouts, ça va aussi lancer tortues(). Pas glop.

Pour éviter ça:

 
def tortues():
    print "kawabunga"
 
if __name__ == '__main__':
    tortues()

Ainsi, si on fait python egouts.py, ça va lancer tortues() mais pas si on fait import egouts dans un autre script.

Comment ça marche ?

C’est une condition tout à fait ordinaire, on peut mettre des if n’importe où dans du code Python.

La seule astuce consiste en l’existence de la variable __name__ qui est une variable automatiquement créée par Python, toujours disponible, n’importe où, dans tous les scripts.

Cette variable contient le nom du script courant si on importe le script. Ainsi, dans n’importe quel code, on peut vérifier où on est.

Mais si le script est le script principal, alors __name__ ne contient pas le nom du script, il contient la chaîne __main__ (oui, c’est bizarre avec deux underscores, mais c’est une chaîne normale).

Donc on dit juste: si ce code est exécuté en tant que script principal (appelé directement avec Python et pas importé), alors exécuter cette fonction.

14 thoughts on “Pourquoi if __name__ == '__main__' en Python ?

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.