Pourquoi utiliser Def main ()? [dupliquer]

possible Duplicate:

que fait if __name__== "__main__" ?

j'ai vu des exemples de code et des tutoriels qui utilisent

def main():
    # my code here

if __name__ == "__main__":
    main()

mais pourquoi? Y a-t-il une raison de ne pas définir vos fonctions en haut du fichier, puis d'y écrire du code? c'est à dire

def my_function()
    # my code here

def my_function_two()
    # my code here

# some code
# call function
# print(something)

je me demande s'il y a une rime le principal?

465
demandé sur Community 2010-10-28 12:54:21

5 réponses

sans la sentinelle principale, le code serait exécuté même si le script était importé comme un module.

538
répondu Ignacio Vazquez-Abrams 2016-12-21 18:31:24

tout le monde y a déjà répondu, mais je pense que j'ai encore quelque chose à ajouter.

raisons D'avoir que if déclaration appelant main() (dans aucun ordre particulier):

  • D'autres langues (comme le C et le Java) ont une fonction main() qui est appelée lorsque le programme est exécuté. En utilisant ce if , nous pouvons faire python se comporter comme eux, qui se sent plus familier pour beaucoup de gens.

  • Code sera nettoyeur , plus facile à lire, et mieux organisé. (Ouais, je sais que c'est subjectif)

  • il sera possible de import que le code python comme un module sans effets secondaires désagréables.

    • cela signifie qu'il sera possible d'effectuer des essais contre ce code.

    • cela signifie que nous pouvons importer ce code dans un shell python interactif et le tester/déboguer/l'exécuter.

  • les Variables à l'intérieur de def main sont local , tandis que ceux à l'extérieur de celui-ci sont global . Cela peut introduire quelques bugs et des comportements inattendus.

mais, vous êtes pas nécessaire pour écrire un main() et l'appeler à l'intérieur d'une instruction if .

je commence moi-même habituellement à écrire de petits scripts de sortie sans aucune sorte de fonction. Si le script grossit suffisamment, ou si je sens que mettre tout ce code dans une fonction me sera bénéfique, alors je reformule le code et le fais. Cela se produit également lorsque j'écris des scripts bash .

Même si vous mettez le code dans la fonction principale, vous n'êtes pas obligé de l'écrire exactement comme que. Une variation nette pourrait être:

import sys

def main(argv):
    # My code here
    pass

if __name__ == "__main__":
    main(sys.argv)

cela signifie que vous pouvez appeler main() à partir d'Autres scripts (ou shell interactif) passant des paramètres personnalisés. Cela peut être utile dans les essais unitaires ou lors du traitement par lots. Mais rappelez-vous que le code ci-dessus exigera l'analyse d'argv, donc peut-être qu'il serait préférable d'utiliser un appel différent qui passe les paramètres déjà analysés.

dans une application orientée objet que j'ai écrite, le code ressemblait à ceci:

class MyApplication(something):
    # My code here

if __name__ == "__main__":
    app = MyApplication()
    app.run()

alors, n'hésitez pas à écrire le code qui vous conviendra le mieux. :)

203
répondu Denilson Sá Maia 2014-09-10 19:12:15

si le contenu foo.py

print __name__
if __name__ == '__main__':
    print 'XXXX'

Un fichier foo.py peut être utilisé de deux façons.

  • importé dans un autre fichier: import foo

dans ce cas __name__ est foo , la section de code ne s'exécute pas et n'imprime pas XXXX .

  • exécuté directement: python foo.py

Lorsqu'il est exécuté directement, __name__ est identique à __main__ et le code dans cette section est exécuté et imprime XXXX

L'une des utilisations de cette fonctionnalité pour écrire divers types de tests unitaires dans le même module.

85
répondu pyfunc 2014-07-06 10:30:11

Que fait if __name__==“__main__”: ? " a déjà été répondu.

ayant un main() fonction vous permet d'appeler sa fonctionnalité si vous import le module. L'avantage principal (sans jeu de mots) de cette (IMHO) est que vous pouvez l'essayer en unité.

16
répondu Johnsyweb 2017-05-23 11:47:30

considérez le second script. Si vous l'importer dans un autre, les instructions, au "niveau mondial", sera exécuté.

7
répondu Noe 2010-10-28 08:56:48