__main__ y scope en python

De alguna manera me sorprendió el siguiente comportamiento:

def main(): print "%s" % foo if __name__ == "__main__": foo = "bar" main() 

es decir, una función de módulo tiene acceso a las variables __main__ en __main__ . ¿Cuál es la explicación para ello?

Las variables en el scope global de los módulos actuales son visibles en cualquier parte del módulo; esta regla también se aplica al módulo __main__ .

Del tutorial de Guido :

En cualquier momento durante la ejecución, hay al menos tres ámbitos nesteds cuyos espacios de nombres son directamente accesibles:

  • El ámbito más interno, que se busca primero, contiene los nombres locales
  • los ámbitos de cualquier función de cierre, que se buscan a partir del scope de cierre más cercano, contienen nombres no locales, pero también no globales
  • El scope del siguiente al último contiene los nombres globales del módulo actual
  • el ámbito más externo (el último buscado) es el espacio de nombres que contiene nombres integrados

La cosa aquí es que:

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

define una variable global llamada foo en ese script. Así que cualquier función de ese módulo tendrá acceso a él.

La pieza de código enumerada anteriormente es global para el módulo y no está dentro de ninguna función.

foo es una variable global del módulo (no está en ninguna función). Todos los ámbitos dentro del módulo pueden acceder a él.

En Python existe el ámbito global, y las funciones tienen sus propios ámbitos. Así que usted define foo bajo el nombre == main, está en el ámbito global. Además, no es un error utilizar una variable que aún no se ha declarado, en una función, si se declarará en el momento en que se llamará la función.