web-dev-qa-db-fra.com

"Boilerplate" code en Python?

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?

28
Bhaxy
  1. Il est répétitif dans le sens où il est répété pour chaque script que vous pourriez exécuter à partir de la ligne de commande.
  2. Si vous mettez votre code principal dans une fonction comme celle-ci, vous pouvez importer le module sans l'exécuter. C'est parfois utile. Cela permet également de mieux organiser les choses. 
  3. Identique au n ° 2 pour autant que je sache
  4. Le python est généralement assez efficace pour éviter le surchauffe. Il est suffisamment flexible pour que, dans la plupart des situations, vous puissiez écrire du code pour produire le passe-partout plutôt que de l'écrire. 

Question hors sujet:

Si vous n'écrivez pas de code pour vérifier les arguments, ils sont ignorés.

19
Winston Ewert

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.

6
andronikus

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.

2
crizCraig

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.

2
millimoose

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! ;-)

1
Risto

Prenons un instant pour voir ce qui s’est passé lorsque vous avez appelé import sys

  • Python consulte une liste et introduit le module sys
  • Il trouve la fonction argv et l'exécute

Alors, 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: 

  • le programme lui-même (la logique), défini sous main, et 
  • la partie appel qui vérifie si main existe

Vous é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

0
notnarayan