lib2to3 - python 2 to 3 online
¿Debería usar un método main() en un simple script de Python? (5)
Tengo muchos scripts simples que calculan algunas cosas más o menos. Consisten en un solo módulo.
¿Debo escribir los métodos principales para ellos y llamarlos con el constructo if __name__
, o simplemente volcarlo todo allí?
¿Cuáles son las ventajas de cualquiera de los métodos?
Bueno, si haces esto:
# your code
Luego import your_module
ejecutará tu código. Por el contrario, con esto:
if __name__ == ''__main__'':
# your code
La importación no ejecutará el código, pero la orientación del intérprete en ese archivo sí lo hará.
Si la única forma en que se ejecutará el script es mediante la apertura manual del intérprete, no hay absolutamente ninguna diferencia.
Esto se vuelve importante cuando tienes una biblioteca (o reutilizando las definiciones en el script).
Agregar código a una biblioteca fuera de una definición, o fuera de la protección de
if __name__
ejecuta el código al importar, lo que le permite inicializar cosas que la biblioteca necesita.Quizás desee que su biblioteca también tenga alguna funcionalidad ejecutable. Tal vez probar, o tal vez algo como el servidor SimpleHTTPS de Python (viene con algunas clases, pero también puedes ejecutar el módulo y se iniciará un servidor). Puedes tener ese doble comportamiento con la cláusula
if __name__
.Las herramientas como
epydoc
importan el módulo para acceder a las cadenas de documentos, por lo que correr el código cuando solo quieres generar documentación HTML no es realmente la intención.
La construcción if __name__
le permitirá reutilizar fácilmente las funciones y clases en el módulo en otros scripts de Python. Si no haces eso, todo el contenido del módulo se ejecutará cuando se import
.
Si no hay nada en el script que quiera reutilizar, entonces seguro, simplemente voltéelo todo allí. Lo hago a veces Si luego decides que quieres reutilizar algún código, he descubierto que Python es el lenguaje más fácil para refactorizar el código sin romperlo.
Las otras respuestas son buenas, pero quería agregar un ejemplo de por qué es posible que desee poder importarlo: pruebas unitarias. Si tiene algunas funciones y luego el if __name__=="__main__":
puede importar el módulo para la prueba unitaria. Quizás eres mejor que yo en esto, pero me parece que mis "scripts simples que posiblemente no tienen ningún error" tienden a tener errores que encuentro con las pruebas unitarias.
Para una buena explicación del propósito del modismo de "guardia principal" de Python:
Siempre escribo una función main()
(apropiadamente nombrada), y pongo nada más que un análisis de línea de comandos y una llamada a main()
en el bloque if __name__ == ''__main__''
. Esto se debe a que no importa cuán tonto, trivial o de propósito único originalmente esperaba ese script, siempre termino queriendo llamarlo desde otro módulo en una fecha posterior.
O me tomo el tiempo para convertirlo en un módulo importable hoy, o dejo tiempo extra para refactorizarlo meses después cuando quiero reutilizarlo para otra cosa.
Siempre.
Cada vez.
Dejé de pelear y comencé a escribir mi código con esa expectativa desde el principio.