web-dev-qa-db-fra.com

Comprendre la méthode principale de python

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()
143
Borat Sagdiyev

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:

  • Autoriser un module à fournir une fonctionnalité d'importation dans un autre code tout en fournissant également une sémantique utile en tant que script autonome (encapsuleur de ligne de commande autour de la fonctionnalité)
  • Permettre à un module de définir une suite de tests unitaires qui sont stockés avec (dans le même fichier que) le code à tester et qui peuvent être exécutés indépendamment du reste de la base de code.

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__:'.

  • (Ruby implémente également une fonctionnalité similaire if __file__ == $0).
196
Jim Dennis

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.

65
Borat Sagdiyev

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.

18
Code-Apprentice

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

7
Aaron