¿Cuál es el punto de una función principal y / o __name__ == “__main__” cheque en Python?

Posible duplicado:
¿Qué hace ?

De vez en cuando me doy cuenta de algo como lo siguiente en los scripts de Python:

if __name__ == "__main__": # do stuff like call main() 

¿Cuál es el punto de esto?

Tener todo el código de Python activo dentro de una función (es decir, no en el nivel superior del módulo) es una optimización de rendimiento crucial, así como un factor importante en la buena organización del código (el comstackdor de Python puede optimizar el acceso a variables locales en una función mucho mejor que puede optimizar las variables “locales” que en realidad son las variables globales de un módulo, ya que la semántica de este último es más exigente).

Hacer que la llamada a la función esté condicionada a que el módulo actual se ejecute como el “script principal” (en lugar de importarlo de otro módulo) hace posible la reutilización de nuggets de funcionalidad contenida en el módulo (ya que otros módulos pueden importarlo y simplemente llamar al funciones o clases apropiadas), y lo que es más importante, es compatible con pruebas de unidad sólidas (donde generalmente es necesario configurar todo tipo de simulaciones y falsificaciones para subsistemas externos antes de que se ejecute y pruebe la funcionalidad del módulo).

Esto permite que una secuencia de comandos de Python se importe o se ejecute de forma independiente es una forma sensata.

Si ejecuta un archivo python directamente, la variable __name__ contendrá __main__ . Si importas el script ese no será el caso. Normalmente, si importa el script, desea llamar funciones o clases de referencia desde el archivo.

Si no tenía esta comprobación, cualquier código que no estuviera en una clase o función se ejecutaría al importar.

El único propósito de esto, suponiendo que esté en main.py , es que otros archivos puedan import main para incluir clases y funciones que están en su progtwig “main”, pero sin ejecutar el código fuente.

Sin esta condición, el código que está en el ámbito global se ejecutará cuando sea importado por otros scripts.

Es un gran lugar para poner pruebas de módulo. Esto solo se ejecutará cuando un módulo se ejecute directamente desde el shell, pero no se ejecutará si se importa.