python boilerplate

¿Código “Boilerplate” en Python?



(6)

  1. Es repetitivo en el sentido de que se repite para cada secuencia de comandos que puede ejecutar desde la línea de comandos.
  2. Si coloca su código principal en una función como esta, puede importar el módulo sin ejecutarlo. Esto es a veces útil. También mantiene las cosas un poco más organizadas.
  3. Lo mismo que el # 2 por lo que puedo decir
  4. Python es generalmente bastante bueno para evitar repetitivo. Es lo suficientemente flexible como para que en la mayoría de las situaciones pueda escribir código para producir la placa de repetición en lugar de escribir código de placa de la caldera.

Pregunta fuera de tema:

Si no escribe código para verificar los argumentos, se ignoran.

Google tiene un tutorial de Python, y describen el código de plantilla como "desafortunado" y proporcionan este ejemplo:

#!/usr/bin/python # import modules used here -- sys is a very standard one import sys # Gather our code in a main() function def main(): print ''Hello there'', sys.argv[1] # Command line args are in sys.argv[1], sys.argv[2] .. # sys.argv[0] is the script name itself and can be ignored # Standard boilerplate to call the main() function to begin # the program. if __name__ == ''__main__'': main()

Ahora, he escuchado que el código repetitivo se describe como "un código aparentemente repetitivo que aparece una y otra vez para obtener un resultado que parece que debería ser mucho más simple" ( example ).

De todos modos, en Python, la parte considerada código "boilerplate" del ejemplo anterior fue:

if __name__ == ''__main__'': main()

Ahora, mis preguntas son las siguientes:

1) ¿El código repetitivo en Python (como en el ejemplo proporcionado) toma la misma definición que la definición que proporcioné? Si es así, ¿por qué?

2) ¿Es este código incluso necesario? Me parece que el código se ejecuta independientemente de que exista o no un método principal. ¿Qué hace que el uso de este código sea mejor? ¿Es aún mejor?

3) ¿Por qué usamos ese código y qué servicio ofrece?

4) ¿Ocurre esto en todo Python? ¿Hay otros ejemplos de "código repetitivo"?

Ah, y solo una pregunta fuera de tema: ¿necesita import sys para usar argumentos de línea de comandos en Python? ¿Cómo maneja tales argumentos si no está ahí?


1) repetitivo principal es común, pero no puede ser más simple

2) main() no se llama sin el repetitivo

3) el boilerplate permite el uso del módulo como un script independiente y como una biblioteca en otros programas

4) Es muy común. doctest es otro.

Entrena para convertirte en un gurú de Python ... ¡y buena suerte con la tesis! ;-)


La razón por la que el bloque if __name__ == "__main__": se llama repetitivo en este caso es que replica una funcionalidad que es automática en muchos otros idiomas. En Java o C ++, entre muchos otros, cuando ejecute su código buscará un método main() y lo ejecutará, e incluso se quejará si no está allí. Python ejecuta cualquier código que esté en su archivo, por lo que debe indicarle que ejecute el método main() ; una alternativa simple sería hacer que la ejecución del método main() la funcionalidad predeterminada.

Entonces, if __name__ == "__main__": es un patrón común que podría ser más corto. No hay razón para que no puedas hacer algo diferente, como:

if __name__ == "__main__": print "Hello, !" for i in range(3): print i exit(0)

Esto funcionará bien; Aunque mi ejemplo es un poco tonto, puedes ver que puedes poner lo que quieras allí. Los diseñadores de Python eligieron este comportamiento para ejecutar automáticamente el método main() (que bien puede no existir), probablemente porque Python es un lenguaje de "scripting"; para que pueda escribir algunos comandos directamente en un archivo, ejecutarlo y ejecutar sus comandos. Personalmente, lo prefiero a la manera de Python porque hace que comenzar en Python sea más fácil para los principiantes, y siempre es bueno tener un lenguaje donde Hello World sea una línea.


La razón por la que utiliza una comprobación "si principal" es para que pueda tener un módulo que ejecute alguna parte de su código en el nivel superior (para crear las cosas - constantes, funciones o clases - se exporta), y alguna parte solo cuando se ejecuta como una secuencia de comandos (por ejemplo, pruebas de unidad para su funcionalidad).

La razón por la que este último código debe incluirse en una función es porque las variables locales del bloque main() se filtrarían en el alcance del módulo.

Ahora, un diseño alternativo podría ser que un archivo ejecutado como un script tendría que declarar una función llamada, digamos, __main__() , pero eso significaría agregar un nuevo nombre de función magic al lenguaje, mientras que el mecanismo __name__ ya está allí. (Y no se pudo eliminar, porque cada módulo debe tener un __name__ , y un módulo ejecutado como un script debe tener un nombre "especial" debido a la forma en que se asignan los nombres de los módulos). Presentamos dos mecanismos para hacer lo mismo. deshacerse de dos líneas de repetición, y generalmente de dos líneas por aplicación , simplemente no parece que valga la pena.


No es necesario agregar un if __name__ == ''__main__'' para los scripts de uso único que no pretenden ser parte de un proyecto más grande. Vea here para una gran explicación. Solo lo necesita si desea ejecutar el archivo por sí mismo Y lo incluye como un módulo junto con otros archivos de Python.

Si solo desea ejecutar un archivo, puede tener cero repetitivo:

print 1

y ejecútelo con $ python your_file.py

Al agregar la línea shebang #!/usr/bin/python y ejecutar chmod +x print_one.py tienes la capacidad de correr con

./print_one.py

Finalmente, # coding: utf-8 permite agregar unicode a su archivo si desea poner ❤''s por todas partes.


Tomemos un momento para ver qué sucedió cuando llamó a import sys :

  • Python mira una lista y trae el módulo sys
  • Encuentra la función argv y la ejecuta.

Entonces, ¿qué está pasando aquí?

Se está utilizando una función escrita en otro lugar para realizar ciertas operaciones dentro del alcance del programa actual. Programar de esta manera tiene muchos beneficios. Separa la lógica del trabajo real.

Ahora, en lo que respecta a la plantilla, hay dos partes:

  • el programa en sí (la lógica), definido en main , y
  • la parte llamada que verifica si existe main

Básicamente, usted escribe su programa en main , utilizando todas las funciones que definió justo antes de definir main (o en otro lugar), y deja que Python busque main .