63 votes

__main__ et portée en python

J'ai été en quelque sorte surpris par le comportement suivant :

 def main():
    print "%s" % foo

if __name__ == "__main__":
    foo = "bar"
    main()

c'est-à-dire qu'une fonction de module a accès aux variables englobantes dans le __main__ . Quelle en est l'explication ?

16voto

SanSS Points 2834

Le truc ici c'est que :

 if __name__ == "__main__":
    foo = "bar"

définit une variable globale nommée foo dans ce script. donc n'importe quelle fonction de ce module y aura accès.

Le morceau de code répertorié ci-dessus est global au module et non à l'intérieur d'une fonction.

8voto

sinelaw Points 6641

foo est une variable globale de module (elle n'est dans aucune fonction). Toutes les étendues du module peuvent y accéder.

4voto

kynnysmatto Points 1238

En python, il y a la portée globale et les fonctions ont leurs propres portées. Donc si vous définissez foo sous le nom==main, c'est dans la portée globale. De plus, ce n'est pas une erreur d'utiliser une variable qui n'a pas encore été déclarée, dans une fonction, si elle le sera au moment où la fonction sera appelée.

0voto

giwyni Points 488

Comme l'a souligné sinelaw, la solution à ce désagrément et à ce(s) bogue(s) par inadvertance est d'utiliser une fonction. Cette fonction peut être dans le 'if main :' comme ceci :

 if __name__ == "__main__":
    def mainlet():
        foo = "bar"
    mainlet()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X