2012-10-09 17 views

Respuesta

10

No hay nada especial sobre el bloque if __name__ == '__main__' en absoluto. Es decir, su alcance está determinado por el lugar donde ocurre. Dado que tales bloques típicamente ocurren en el nivel superior, su alcance es global.

Si este bloque se produjera en una función, lo cual es perfectamente legal, su alcance sería local, excepto que __name__ se resolvería al valor global definido en el módulo.

5
>>> if __name__ == '__main__': 
...  x = 1 
... print 'x' in globals() 
True 

edición: user4815162342 hace que el excelente punto de que esta sentencia if se puede escribir en cualquier alcance. Se escribe con mayor frecuencia en el ámbito global.

aquí está dentro de una función:

>>> def foo(): 
...  if __name__ == '__main__': 
...   bar = 1 
... foo() 
... print 'bar' in globals() 
False 
+1

De manera algo confusa, también está en 'locals()': http://ideone.com/WbvTj. Presumiblemente, en el nivel superior del módulo, el alcance global es el mismo que el local. – millimoose

3

Python no tiene ámbito de bloque local, por lo que cualquier variable que utiliza dentro de un bloque de if se añadirá a la que encierra el alcance "real" más cercano. (Para un bloque if..main, por lo general serán los atributos del módulo.)

1

Es en el ámbito global, siempre y cuando:

  1. se le llama en el ámbito global, es decir, no desde dentro de una función
  2. está en el archivo de código que se está ejecutando.

Para ilustrar (2):

supongamos que usted es el código de foo.py, y en bar.py, usted tiene la declaración from foo import *. En este caso, el bloque if __name__ == "__main__": en foo.py no se ejecuta. Este bloque solo se ejecuta cuando se ejecuta foo.py

+0

En realidad, el bloque 'if __name__ == '__main __'' se ejecuta muy bien, simplemente es que '__name__' no es' __main__', sino 'foo'. Esta configuración de '__name__' es completamente ortogonal a las reglas de scoping variable. – user4815162342

+0

@ user4815162342: Tienes razón. Solo quería asegurarme de que el OP no importara 'foo' dentro de' bar' y me pregunto por qué las variables en 'if __name__ ==" __main __ "' en 'foo' no aparecían en' bar''s alcance global. – inspectorG4dget

Cuestiones relacionadas