Je suis nouveau sur Python, mais j’ai de l’expérience dans d’autres OOP langues. Mon cours n'explique pas la méthode principale en python.
Dites-moi comment fonctionne la méthode principale dans python? Je suis confus parce que j'essaie de le comparer à Java.
def main():
# display some lines
if __== "__main__": main()
Comment est exécuté et pourquoi ai-je besoin de cet étrange if
pour exécuter main
. Mon code est terminé sans sortie lorsque je supprime le if
.
Le code minimal -
class AnimalActions:
def quack(self): return self.strings['quack']
def bark(self): return self.strings['bark']
class Duck(AnimalActions):
strings = dict(
quack = "Quaaaaak!",
bark = "The duck cannot bark.",
)
class Dog(AnimalActions):
strings = dict(
quack = "The dog cannot quack.",
bark = "Arf!",
)
def in_the_doghouse(dog):
print(dog.bark())
def in_the_forest(duck):
print(duck.quack())
def main():
donald = Duck()
fido = Dog()
print("- In the forest:")
for o in ( donald, fido ):
in_the_forest(o)
print("- In the doghouse:")
for o in ( donald, fido ):
in_the_doghouse(o)
if __== "__main__": main()
L'approche Python de "main" est presque unique au langage (*).
La sémantique est un peu subtile. L'identificateur __name__
est lié au nom de tout module en cours d'importation. Cependant, lorsqu'un fichier est en cours d'exécution, alors __name__
est défini sur "__main__"
(la chaîne littérale: __main__
).
Ceci est presque toujours utilisé pour séparer la partie de code qui doit être exécutée des parties de code qui définissent les fonctionnalités. Donc, le code Python contient souvent une ligne comme celle-ci:
#!/usr/bin/env python
from __future__ import print_function
import this, that, other, stuff
class SomeObject(object):
pass
def some_function(*args,**kwargs):
pass
if __== '__main__':
print("This only executes when %s is executed rather than imported" % __file__)
En utilisant cette convention, un fichier peut définir des classes et des fonctions à utiliser dans d'autres programmes, ainsi que du code à évaluer uniquement lorsque le fichier est appelé en tant que script autonome.
Il est important de comprendre que tout le code au-dessus de la ligne if __name__
est en cours d'exécution, évalué, dans les deux cas. Il est évalué par l'interprète lorsque le fichier est importé ou lorsqu'il est exécuté. Si vous mettez une instruction print
avant la ligne if __name__
, le résultat sera imprimé à chaque fois qu'un autre code tente de l'importer en tant que module. (Bien sûr, ce serait antisocial. Ne faites pas ça).
Personnellement, j'aime ces sémantiques. Il encourage les programmeurs à séparer la fonctionnalité (définitions) de la fonction (exécution) et encourage la réutilisation.
Idéalement, presque tous les modules Python peuvent faire quelque chose d’utile s’ils sont appelés à partir de la ligne de commande. Dans de nombreux cas, il est utilisé pour gérer les tests unitaires. Si un fichier particulier définit des fonctionnalités qui ne sont utiles que dans le contexte d'autres composants d'un système, vous pouvez toujours utiliser __== "__main__"
pour isoler un bloc de code appelant une suite de tests unitaires s'appliquant à ce module.
(Si vous n'allez pas avoir de telles fonctionnalités ni de tests unitaires, il vaut mieux vous assurer que le mode fichier n'est PAS exécutable).
Résumé: if __== '__main__':
a deux cas d'utilisation principaux:
Il est assez commun de def main(*args)
et que if __== '__main__':
appelle simplement main(*sys.argv[1:])
si vous voulez définir main de manière similaire à certains autres langages de programmation. Si votre fichier .py est principalement destiné à être utilisé comme module dans un autre code, vous pouvez alors def test_module()
et appeler test_module()
dans votre suite if __== '__main__:'
.
if __file__ == $0
).En Python, l'exécution ne doit PAS commencer par main. La première ligne de "code exécutable" est exécutée en premier.
def main():
print("main code")
def meth1():
print("meth1")
meth1()
if __== "__main__":main() ## with if
Sortie -
meth1
main code
Plus d'informations sur main () - http://ibiblio.org/g2swap/byteofpython/read/module-name.html
Un module de __name__
Chaque module a un nom et les instructions dans un module peuvent trouver le nom de son module. Ceci est particulièrement utile dans une situation particulière - Comme mentionné précédemment, lorsqu'un module est importé pour la première fois, le bloc principal de ce module est exécuté. Que faire si nous voulons exécuter le bloc uniquement si le programme a été utilisé seul et non lorsqu'il a été importé depuis un autre module? Ceci peut être réalisé en utilisant l'attribut name du module.
Utilisation du nom __ du module __
#!/usr/bin/python
# Filename: using_name.py
if __== '__main__':
print 'This program is being run by itself'
else:
print 'I am being imported from another module'
Sortie -
$ python using_name.py
This program is being run by itself
$ python
>>> import using_name
I am being imported from another module
>>>
Comment ça marche -
Chaque module Python a son __name__
défini et s'il s'agit de __main__
, cela signifie que le module est exécuté de manière autonome par l'utilisateur et que nous pouvons effectuer les actions appropriées correspondantes.
Python n'a pas de point d'entrée défini comme Java, C, C++, etc. Il exécute simplement un fichier source ligne par ligne. L'instruction if
vous permet de créer une fonction main
qui sera exécutée si votre fichier est chargé en tant que module "principal" plutôt qu'en tant que bibliothèque dans un autre module.
Pour être clair, cela signifie que l’interprète Python commence à la première ligne d’un fichier et l’exécute. L'exécution de lignes telles que class Foobar:
et def foobar()
crée une classe ou une fonction et les stocke en mémoire pour une utilisation ultérieure.
Si vous importez le fichier de module (.py) que vous créez maintenant à partir d'un autre script python, il n'exécutera pas le code
if __== '__main__':
...
Si vous exécutez le script directement à partir de la console, il sera exécuté.
Python n'utilise pas ou n'a pas besoin d'une fonction main (). Tout code qui n'est pas protégé par cette garde sera exécuté lors de l'exécution ou de l'importation du module.
Ceci est développé un peu plus à python.berkely.ed