Intento responder a la pregunta principal con una explicación lo más completa posible.
Desarrollando y probando su código
Digamos que estás escribiendo un Python script diseñado para ser usado como un módulo:
def do_important():
'''This function does something very important'''
Usted podría Pruebe el módulo añadiendo esta llamada de la función en la parte inferior:
do_important()
y ejecutándolo con algo como (en un símbolo de comando):
~$ python important.py
El problema
Sin embargo, si quieres importar el módulo a otro script:
import important
En la importación, el do_important
se llamaría a la función, así que probablemente comentarías tu llamada a la función en la parte inferior. Y entonces tendrás que recordar si has comentado o no tu llamada a la función de prueba. Y esta complejidad adicional significaría que probablemente lo olvides, haciendo que tu proceso de desarrollo sea más problemático.
Una mejor manera
El __name__
La variable apunta al espacio de nombres donde se encuentra el intérprete de Python en este momento. Dentro de un módulo importado, es el nombre de ese módulo. Pero dentro del módulo primario (o el REPL de un intérprete) desde el que se ejecuta todo, es "__main__"
.
Así que si lo compruebas antes de ejecutar:
if __name__ == "__main__":
do_important()
Con lo anterior, tu código sólo se ejecutará cuando lo estés ejecutando como módulo primario (o lo llames intencionadamente desde otro script).
Una forma aún mejor
Sin embargo, hay una forma Pythonica de mejorar esto.
El código Python puede correr más rápido en una función (ver el enlace para saber cómo y por qué), así que si ponemos el código que queremos ejercitar a medida que desarrollamos y probamos en una función como esta y luego hacemos nuestra comprobación de principal inmediatamente después:
def main():
'''business logic for when running this module as the primary one!'''
setup()
foo = do_important()
bar = do_even_more_important(foo)
for baz in bar:
do_super_important(baz)
teardown()
# Here's our payoff idiom!
if __name__ == '__main__':
main()
Ahora tenemos una función final para el final de nuestro módulo que se ejecutará si ejecutamos el módulo como módulo primario, pero que también permitirá que el módulo y sus funciones y clases se importen a otros scripts sin ejecutar el main
funcionan, de la manera más eficiente (si la eficiencia importa).
Este modismo también se puede encontrar (profundo) en la documentación de Python en una explicación de la __main__
módulo. Ese texto dice:
Este módulo representa el ámbito (por lo demás anónimo) en el que el el programa principal del intérprete se ejecuta - los comandos se leen ya sea de entrada estándar, desde un archivo script, o desde un prompt interactivo. Es es este entorno en el que la estrofa idiomática "condicional script" hace que se ejecute un script:
if __name__ == '__main__':
main()