Pourquoi utiliser Def main ()? [dupliquer]
possible Duplicate:
que faitif __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?
5 réponses
sans la sentinelle principale, le code serait exécuté même si le script était importé comme un module.
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 ceif
, 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. :)
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.
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é.
considérez le second script. Si vous l'importer dans un autre, les instructions, au "niveau mondial", sera exécuté.