Dois-je utiliser une méthode main() dans un simple script Python?
J'ai beaucoup de scripts simples de calcul de certaines choses ou si. Ils sont constitués d'un seul module.
Dois-je écrire méthodes principales pour eux et de les appeler avec le if __name__
construire, ou simplement le jeter tout droit dans là?
Quels sont les avantages de l'une ou l'autre méthode?
Vous devez vous connecter pour publier un commentaire.
Bien, si vous faites cela:
Puis
import your_module
va exécuter votre code. Au contraire, avec cette:L'importation de ne pas exécuter le code, mais le ciblage de l'interprète à ce fichier.
Si le seul moyen de le script ne va jamais à exécuter est par manuel de l'interprète de l'ouverture, il n'y a absolument aucune différence.
Cela devient important lorsque vous avez une bibliothèque (ou de réutiliser les définitions dans le script).
Ajout de code pour une bibliothèque en dehors d'une définition, ou à l'extérieur de la protection de
if __name__
exécute le code lors de l'importation, vous permettant d'initialiser des trucs qui a besoin de la bibliothèque.Peut-être que vous voulez que votre bibliothèque aussi avoir une certaine praticable fonctionnalité. Peut-être des tests, ou peut-être quelque chose comme Python SimpleHTTPServer (il est livré avec certaines classes, mais vous pouvez également exécuter le module et il va commencer à un serveur). Vous pouvez avoir ce double comportement avec le
if __name__
clause.Des outils comme
epydoc
importer le module pour accéder à la docstrings, afin d'exécuter le code, quand vous voulez juste pour générer la documentation HTML n'est pas vraiment le but.J'écris toujours un
main()
fonction (bien nommé), et rien mis, mais la ligne de commande d'analyse et un appel àmain()
dans leif __name__ == '__main__'
bloc. C'est parce que peu importe comment stupide, banal, ou le seul but j'ai d'abord attendre que le script, j'ai toujours envie de l'appeler à partir d'un autre module à une date ultérieure.Soit je prends le temps de faire un importables module d'aujourd'hui, ou passer du temps supplémentaire pour refactoriser mois plus tard, lorsque je veux le réutiliser pour autre chose.
Toujours.
À chaque fois.
Je n'ai cessé de combattre et a commencé à écrire mon code avec ce qui est attendu dès le début.
if __name__
barrière. C'est un bon modèle pour la création de console_script points d'entrée, par exemple'console_scripts': ['myscript=foo.mybar:main']
ifmain
fragment de code à insérer le "if __name__..." partie.Autres réponses sont bonnes, mais je voulais ajouter un exemple de pourquoi vous pourriez être en mesure de les importer: les tests unitaires. Si vous avez un peu de fonctions et ensuite le
if __name__=="__main__":
, vous pouvez importer le module de test unitaire. Peut-être que vous êtes mieux que moi, mais je trouve que mon "scripts simples qui ne pouvait pas avoir des bugs" ont tendance à avoir des bugs que je trouve avec des tests unitaires.La
if __name__
construire vous permettra de facilement ré-utiliser les fonctions et les classes du module dans d'autres scripts Python. Si vous ne le faites pas, alors tout dans le module sera exécuté quand il estimport
ed.Si il n'y a rien dans le script que vous souhaitez réutiliser, alors bien sûr, juste dump tous là. Je fais parfois. Si vous décidez plus tard que vous souhaitez réutiliser une partie du code, j'ai trouvé Python à peu près la meilleure langue dans laquelle de refactoriser le code sans les casser.
Pour une bonne explication de l'objectif de Python "gardien principal" l'idiome:
Ce qui ne s' __name__ == "__principaux__": le faire?