standard online python coding-style

online - python package naming conventions



¿Por qué usar def main()? (5)

" ¿Qué sucede if __name__==“__main__”: do? " Ya se ha respondido.

Tener una función main() permite llamar a su funcionalidad si import el módulo. El beneficio principal (sin intención de hacerlo) de esto (IMHO) es que puede probarlo por unidad.

Posible duplicado:
¿Qué hace if __name__== "__main__" hace?

He visto algunos ejemplos de código y tutoriales que utilizan

def main(): # my code here if __name__ == "__main__": main()

¿Pero por qué? ¿Hay alguna razón para no definir sus funciones en la parte superior del archivo, y luego escribir código debajo de él? es decir

def my_function() # my code here def my_function_two() # my code here # some code # call function # print(something)

Me pregunto si hay alguna rima para la principal.


Considere el segundo guión. Si lo importa en otro, se ejecutarán las instrucciones, como a "nivel global".


Sin el centinela principal, el código se ejecutaría incluso si el script se importara como un módulo.


Todos los demás ya lo han respondido, pero creo que todavía tengo algo más que agregar.

Razones para tener esa instrucción if main() (sin ningún orden en particular):

  • Otros lenguajes (como C y Java) tienen una función main() que se llama cuando se ejecuta el programa. Usando esto if , podemos hacer que Python se comporte como ellos, lo que se siente más familiar para muchas personas.

  • El código será más limpio , más fácil de leer y mejor organizado. (si, se que esto es subjetivo)

  • Será posible import ese código de Python como un módulo sin efectos secundarios desagradables.

    • Esto significa que será posible ejecutar pruebas contra ese código.

    • Esto significa que podemos importar ese código en un shell de Python interactivo y probar / depurar / ejecutarlo.

  • Las variables dentro de la def main son locales , mientras que las que están fuera son globales . Esto puede introducir algunos errores y comportamientos inesperados.

Pero, no es necesario que escriba una función main() y la llame dentro de una sentencia if .

Yo mismo, por lo general, comienzo a escribir pequeños scripts desechables sin ningún tipo de función. Si la secuencia de comandos crece lo suficiente, o si siento que poner todo ese código dentro de una función me beneficiará, entonces refactorizo ​​el código y lo hago. Esto también sucede cuando escribo scripts de bash .

Incluso si coloca un código dentro de la función principal, no es necesario que lo escriba exactamente así. Una variación ordenada podría ser:

import sys def main(argv): # My code here pass if __name__ == "__main__": main(sys.argv)

Esto significa que puede llamar a main() desde otros scripts (o shell interactivo) pasando parámetros personalizados. Esto puede ser útil en pruebas unitarias, o cuando se procesa por lotes. Pero recuerde que el código anterior requerirá el análisis de argv, por lo tanto, tal vez sería mejor usar una llamada diferente que pase parámetros ya analizados.

En una aplicación orientada a objetos que he escrito, el código se veía así:

class MyApplication(something): # My code here if __name__ == "__main__": app = MyApplication() app.run()

Entonces, siéntase libre de escribir el código que mejor se adapte a usted. :)


si el contenido de foo.py

print __name__ if __name__ == ''__main__'': print ''XXXX''

Un archivo foo.py se puede usar de dos maneras.

  • importado en otro archivo: import foo

En este caso, __name__ es foo , la sección de código no se ejecuta y no se imprime XXXX .

  • ejecutado directamente: python foo.py

Cuando se ejecuta directamente, __name__ es igual que __main__ y el código en esa sección se ejecuta e imprime XXXX

Uno de los usos de esta funcionalidad para escribir varios tipos de pruebas unitarias dentro del mismo módulo.