Tout le monde a déjà répondu, mais je pense quand même avoir quelque chose à ajouter.
Raisons d'avoir cette instruction if
appelant main()
(sans ordre particulier) :
-
D'autres langages (comme le C et le Java) ont une fonction main()
qui est appelée lorsque le programme est exécuté. En utilisant cet if
, nous pouvons faire en sorte que Python se comporte comme eux, ce qui est plus familier pour beaucoup de gens.
-
Le code sera plus propre, plus facile à lire et mieux organisé. (oui, je sais que c'est subjectif)
-
Il sera possible d'importer
ce code Python en tant que module sans effets secondaires désagréables.
-
Cela signifie qu'il sera possible de faire des tests sur ce code.
-
Cela signifie que nous pouvons importer ce code dans une console interactive Python et le tester/déboguer/exécuter.
-
Les variables à l'intérieur de def main
sont locales, tandis que celles à l'extérieur sont globales. Cela peut introduire quelques bugs et comportements inattendus.
Mais, vous n'êtes pas obligé d'écrire une fonction main()
et de l'appeler à l'intérieur d'une instruction if
.
Personnellement, je commence généralement par écrire de petits scripts temporaires sans aucune fonction. Si le script devient assez gros, ou si je sens que mettre tout ce code dans une fonction me sera profitable, alors je le refactorise et je le fais. Cela arrive aussi lorsque j'écris des scripts bash
.
Même si vous mettez du code à l'intérieur de la fonction main, vous n'êtes pas obligé de l'écrire exactement comme ça. Une variation intéressante pourrait être :
import sys
def main(argv):
# Mon code ici
pass
if __name__ == "__main__":
main(sys.argv)
Cela signifie que vous pouvez appeler main()
depuis d'autres scripts (ou une console interactive) en passant des paramètres personnalisés. Cela peut être utile dans des tests unitaires, ou lors du traitement par lot. Mais rappelez-vous que le code ci-dessus nécessitera l'analyse de argv, donc il serait peut-être préférable d'utiliser un autre appel qui passe déjà des paramètres analysés.
Dans une application orientée objet que j'ai écrite, le code ressemblait à ceci :
class MaClasseQuelconque(quelquechose):
# Mon code ici
if __name__ == "__main__":
app = MaClasseQuelconque()
app.run()
Alors, n'hésitez pas à écrire le code qui vous convient le mieux. :)
3 votes
Voir stackoverflow.com/questions/419163/what-does-if-name-main-do
32 votes
Stackoverflow.com/questions/419163/what-does-if-name-main-do ne répond pas à l'ensemble de la question.
12 votes
Ce que le supposé duplicata ne répond pas : avoir une fonction main() (au lieu d'écrire tout le code dans le bloc "if nom") est utile car cela évite de créer accidentellement des variables globales qui pourraient affecter d'autres fonctions.
1 votes
Tout comme les autres réponses, avoir un point d'entrée pour l'exécution de votre code permet d'utiliser des points d'entrée dans votre setup.py pour produire automatiquement des scripts exécutables qui enveloppent les étapes d'importation et d'exécution. Ce qui est pratique lorsque vous voulez que votre utilisateur puisse écrire
setup-my-app ...
plutôt quepython2.7 /chmein/opaque/vers/module.py ...
0 votes
Le revers de la médaille de faire cela est que maintenant mon code contient des tonnes de déclarations "globales" assis en haut de "def main()" pour chaque CONSTANTE qui est définie par main(). Cela semble non professionnel (du moins à mes yeux).