¿Cuál es el alcance de if __name__ == __main__
? ¿Está todo cubierto por esta declaración en el espacio global?El alcance de if __name__ == __main__
Respuesta
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.
>>> 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
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.)
Es en el ámbito global, siempre y cuando:
- se le llama en el ámbito global, es decir, no desde dentro de una función
- 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
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
@ 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
- 1. PHP equivalente de Python's __name__ == "__main__"?
- 2. Powershell equivilent de Python si __name__ == '__main__':
- 3. ¿Por qué hace esto? si - __name__ == '__main__'
- 4. Usar si __name__ == '__main__': para pruebas
- 5. node.js equivalente de python si __name__ == '__main__'
- 6. __main__ y de alcance en Python
- 7. `if __name__ == '__main __'` equivalente en Ruby
- 8. ¿Cómo configuro __name__ a '__main__' cuando uso IronPython alojado?
- 9. ¿Hay un equivalente R de la pitonica "si __name__ ==" __main__ ": main()"?
- 10. ¿Por qué la función main() no está definida dentro de if '__main__'?
- 11. Rubí equivalente a Python __main__
- 12. ¿Cuál es el alcance de una variable inicializada en una instrucción if?
- 13. Alcance de variables en sentencias if
- 14. ¿Cómo importar un módulo como __main__?
- 15. ¿Por qué cambia el valor de __name__ después de la asignación a sys.modules [__ name__]?
- 16. Alcance de variable de Python en sentencias if
- 17. Problema de alcance variable con sentencias if (PHP)
- 18. ¿Las herramientas de configuración de python admiten el estilo de ejecución `__name__ ==" __main __ "`?
- 19. ¿Cómo obtener el nombre de archivo del módulo __main__ en Python?
- 20. ¿Puedo cambiar el atributo __name__ del objeto en python?
- 21. Python: determine el módulo actual actual (no __main__)
- 22. Analizando el algoritmo if-else if statement
- 23. ¿Determinar el alcance de sincronización?
- 24. Corrección sobre el alcance variable
- 25. maven proporcionó el alcance
- 26. ¿Cuáles son los diferentes valores posibles para __name__ en un script de Python, y qué significan?
- 27. error de alcance en el cierre recursivo
- 28. Obtener __name__ de llamar módulo de función en Python
- 29. Alcance y alcance en rieles
- 30. 'if' y el colon
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