Google propose un didacticiel Python. Ils décrivent le code standard comme "malheureux" et fournissent cet exemple:
#!/usr/bin/python
# import modules used here -- sys is a very standard one
import sys
# Gather our code in a main() function
def main():
print 'Hello there', sys.argv[1]
# Command line args are in sys.argv[1], sys.argv[2] ..
# sys.argv[0] is the script name itself and can be ignored
# Standard boilerplate to call the main() function to begin
# the program.
if __== '__main__':
main()
J'ai entendu dire que le code standard était décrit comme "un code apparemment répétitif qui apparaît encore et encore afin d'obtenir un résultat semblant devoir être beaucoup plus simple" ( exemple ).
Quoi qu'il en soit, en Python, la partie considérée comme du code "passe-partout" de l'exemple ci-dessus était la suivante:
if __== '__main__':
main()
Maintenant, mes questions sont les suivantes:
1) Est-ce que le code standard en Python (comme dans l'exemple fourni) a la même définition que celle que j'ai fournie? Si oui, pourquoi?
2) Ce code est-il même nécessaire? Il me semble que le code fonctionne, qu'il y ait ou non une méthode principale. Qu'est-ce qui rend l'utilisation de ce code meilleure? Est-ce encore mieux?
3) Pourquoi utilisons-nous ce code et quel service fournit-il?
4) Cela se produit-il tout au long de Python? Existe-t-il d'autres exemples de "code passe-partout"?
Oh, et juste une question hors sujet: avez-vous besoin de import sys
pour utiliser des arguments de ligne de commande en Python? Comment gère-t-il de tels arguments s'il n'y en a pas?
Question hors sujet:
Si vous n'écrivez pas de code pour vérifier les arguments, ils sont ignorés.
Dans ce cas, le bloc if __== "__main__":
est appelé "passe-partout", c'est qu'il reproduit une fonctionnalité qui est automatique dans de nombreuses autres langues. En Java ou C++, parmi beaucoup d'autres, lorsque vous exécutez votre code, il recherche une méthode main()
et l'exécute, et se plaint même s'il ne l'est pas. Python exécute le code contenu dans votre fichier. Vous devez donc lui indiquer d’exécuter la méthode main()
; une alternative simple consisterait à utiliser la méthode main()
comme fonctionnalité par défaut.
Donc, if __== "__main__":
est un motif courant qui pourrait être plus court. Il n'y a aucune raison pour que vous ne puissiez pas faire quelque chose de différent, comme:
if __== "__main__":
print "Hello, Stack Overflow!"
for i in range(3):
print i
exit(0)
Cela fonctionnera très bien. bien que mon exemple soit un peu idiot, vous pouvez voir que vous pouvez y mettre ce que vous voulez. Les concepteurs de Python ont choisi ce comportement plutôt que d'exécuter automatiquement la méthode main()
(qui peut ne pas exister), probablement parce que Python est un langage de "script". afin que vous puissiez écrire des commandes directement dans un fichier, l'exécuter et vos commandes s'exécuter. Personnellement, je le préfère à la manière Python car cela facilite le démarrage en Python pour les débutants, et il est toujours agréable d’avoir une langue où Hello World est une ligne.
Vous n'avez pas besoin d'ajouter un if __== '__main__'
pour des scripts uniques qui ne sont pas destinés à faire partie d'un projet plus important. Voir ici pour une bonne explication. Vous n'en aurez besoin que si vous voulez exécuter le fichier lui-même ET l'inclure en tant que module avec d'autres fichiers python.
Si vous voulez seulement exécuter un fichier, vous pouvez avoir zéro passe-partout:
print 1
et lancez-le avec $ python your_file.py
L'ajout de la ligne Shebang#!/usr/bin/python
et l'exécution de chmod +x print_one.py
vous permettent d'exécuter avec
./print_one.py
Enfin, # coding: utf-8
vous permet d'ajouter unicode à votre fichier si vous voulez mettre des partout.
La raison pour laquelle vous utilisez une vérification "if main" est que vous pouvez avoir un module qui exécute une partie de son code au niveau supérieur (pour créer les objets - constantes, fonctions ou classes - il les exporte), et certaines parties uniquement lorsqu'elles sont exécutées en tant que un script (par exemple, les tests unitaires de sa fonctionnalité).
La raison pour laquelle ce dernier code doit être encapsulé dans une fonction est que les variables locales du bloc main()
risquent de fuir dans la portée du module.
Maintenant, une autre conception pourrait être qu'un fichier exécuté en tant que script devrait déclarer une fonction nommée, par exemple, __main__()
, mais cela impliquerait l'ajout d'un nouveau nom de fonction magique à la langue, alors que le mécanisme __name__
est déjà présent. (Et ne peut pas être supprimé, car chaque module doit avoir un __name__
, et un module exécuté en tant que script doit avoir un nom "spécial" en raison de la façon dont les noms de modules sont attribués.) Introduction de deux mécanismes pour faire la même chose juste se débarrasser de deux lignes de passe-partout - et généralement deux lignes de dessus par application - ne semble tout simplement pas la peine.
1) le passe-partout principal est commun, mais ne peut être plus simple
2) main()
n'est pas appelé sans le passe-partout
3) le système standard permet l’utilisation du module en tant que script autonome, et en tant que bibliothèque dans d’autres programmes
4) c’est très courant. doctest
en est un autre.
Entraînez-vous à devenir un gourou de Python… et bonne chance avec votre thèse! ;-)
Prenons un instant pour voir ce qui s’est passé lorsque vous avez appelé import sys
:
sys
argv
et l'exécuteAlors, que se passe-t-il ici?
Une fonction écrite ailleurs est utilisée pour effectuer certaines opérations entrant dans le cadre du programme actuel. La programmation de cette façon présente de nombreux avantages. Il sépare la logique du travail réel.
Maintenant, en ce qui concerne le passe-partout, il y a deux parties:
main
, et main
existeVous écrivez essentiellement votre programme sous main
, en utilisant toutes les fonctions définies juste avant de définir main
(ou ailleurs), et laissez Python rechercher main
.