Question Pourquoi utiliser def main ()? [dupliquer]


Dupliquer possible:
Qu'est ce que if __name__== "__main__" faire? 

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

def main():
    # my code here

if __name__ == "__main__":
    main()

Mais pourquoi? Y at-il une raison de ne pas définir vos fonctions en haut du fichier, puis écrivez simplement le code sous celui-ci? 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 simplement s'il y a une rime dans la main?


448
2017-10-28 08:54


origine


Réponses:


Sans la sentinelle principale, le code serait exécuté même si le script était importé en tant que module.


525
2017-10-28 08:56



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

Raisons d'avoir cela if appel de déclaration main() (dans aucun ordre particulier):

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

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

  • Il sera possible de import ce code python comme un module sans effets secondaires désagréables.

    • Cela signifie qu'il sera possible d'exécuter des tests sur ce code.

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

  • Variables à l'intérieur def main sont local, tandis que ceux en dehors sont global. Cela peut introduire quelques bugs et des comportements inattendus.

Mais vous êtes non requis écrire un main() fonctionner et l'appeler à l'intérieur d'un if déclaration.

Je commence moi-même à écrire de petits scripts jetables sans aucun type de fonction. Si le script devient suffisamment gros ou si je pense que mettre tout ce code dans une fonction me sera utile, alors je refactore le code et le fais. Cela arrive aussi quand j'écris bash scripts.

Même si vous mettez du code dans la fonction principale, vous n'êtes pas obligé de l'écrire exactement comme cela. Une variation soignée 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 tests unitaires ou lors du traitement par lots. Mais rappelez-vous que le code ci-dessus nécessitera l'analyse de l'argv, il serait donc peut-être préférable d'utiliser un appel différent qui transmet 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 convient le mieux. :)


198
2017-10-28 10:00



si le contenu de 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 n'est pas exécutée et n'imprime pas XXXX.

  • exécuté directement: python foo.py

Quand il est exécuté directement, __name__ est le même que __main__ et le code dans cette section est exécuté et imprime XXXX

Un de l'utilisation de cette fonctionnalité pour écrire différents types de tests unitaires au sein du même module.


80
2017-10-28 08:57



"Qu'est ce que if __name__==“__main__”: faire?"a déjà été répondu.

Avoir un main()  fonctionvous permet d'appeler sa fonctionnalité si vous import le module. Le principal avantage (sans jeu de mots) de ceci (IMHO) est que vous pouvez le tester.


15
2017-10-28 08:59



Considérons le deuxième script. Si vous l'importez dans un autre, les instructions, telles que "niveau global", seront exécutées.


7
2017-10-28 08:56