2011-10-26 13 views
24

Google tiene un tutorial de Python, y describen código repetitivo como "lamentable" y proporcionar este ejemplo:Código "Boilerplate" en Python?

#!/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() 

código repetitivo Ahora, he oído que se describe como "código de parecer repetitivo que aparece una y otra vez para obtener algún resultado que parezca que debería ser mucho más simple "(example).

De todas formas, en Python, la parte considerada código "repetitivo" del ejemplo anterior era:

if __name__ == '__main__': 
    main() 

Ahora, mis preguntas son las siguientes:

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

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

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

4) ¿Esto ocurre en 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á allí?

+4

'sys' existe ya sea que lo importe o no. Simplemente no puede usarlo en su código si no lo hace. –

+0

Solo un comentario sobre este código repetitivo específico, siempre debe usar '#!/Usr/bin/env python' en lugar de'! #/Usr/bin/python' porque esto obtiene la versión de python específica del usuario/entorno. Esto es preferible porque es posible que el usuario tenga python llamado algo más o que se instale en una ubicación que no sea/bin aunque normalmente ninguno de estos dos factores es verdadero. Sin embargo, como alguien que ha lidiado con errores derivados de esto, puedo decir que son extremadamente frustrantes. Es como la diferencia entre codificar una ruta difícil o usar una relativa. – guribe94

+0

Por ejemplo, los metadatos para Python 2 y 3, eche un vistazo a [python-boilerplate.com] (https://www.python-boilerplate.com) –

Respuesta

17
  1. Es repetitivo en el sentido de que se repite para cada script 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 a veces es útil. También mantiene las cosas organizadas un poco más.
  3. Igual que el # 2 por lo que puedo decir
  4. Python es generalmente bastante bueno para evitar el texto repetitivo. Es lo suficientemente flexible como para que en la mayoría de las situaciones pueda escribir código para producir el texto estándar en lugar de escribir un código repetitivo.

Off topic pregunta:

Si usted no escribe código para comprobar los argumentos, que son ignorados.

2

La razón por la que utiliza una verificación "si principal" es para que pueda tener un módulo que ejecute una parte de su código en topplevel (para crear cosas -constantes, funciones o clases- exporta) y algunas partes solo cuando se ejecuta como un script (p. ej. pruebas unitarias para su funcionalidad).

La razón por la cual este último código debe ser envuelto en una función es porque las variables locales del bloque main() se filtrarían dentro del 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 mágica al lenguaje, mientras que el mecanismo __name__ ya está ahí. (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 cómo se asignan los nombres de los módulos.) La introducción de dos mecanismos para hacer lo mismo solo para deshacerse de dos líneas de texto repetitivo - y generalmente dos líneas de texto repetitivo por solicitud - simplemente no parece valer la pena.

1

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

2) main() no se llama sin el repetitivo

3) el repetitivo permite el uso del módulo tanto como un proceso 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! ;-)

6

La razón por la cual 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 ejecuta su código buscará un método main() y lo ejecutará, e incluso se quejará si no está allí. Python ejecuta cualquier código en su archivo, por lo que debe indicarle que ejecute el método main(); una alternativa simple sería hacer que ejecutar el método main() sea la funcionalidad predeterminada.

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

if __name__ == "__main__": 
    print "Hello, Stack Overflow!" 

    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 al ejecutar automáticamente el método main() (que bien puede no existir), presumiblemente porque Python es un lenguaje de "secuencias de comandos"; para que pueda escribir algunos comandos directamente en un archivo, ejecutarlo y ejecutar sus comandos. Personalmente, prefiero 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.

+1

He visto algunos módulos que ejecutan pruebas si los ejecuta directamente. y he usado el mismo enfoque yo en ocasiones. Muy útil para asegurarse de no romper algo durante el desarrollo. Cuando se importa como un módulo, por supuesto, las pruebas no se ejecutan. – kindall

0

Tomemos un momento para ver lo que sucedió cuando llamó import sys:

  • Python se ve en una lista y trae en el módulo sys
  • Se encuentra la función argv y lo 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. La programación de esta manera tiene muchos beneficios. Separa la lógica del trabajo real.

Ahora, en lo que se refiere a la plancha de caldera, hay dos partes:

  • el programa en sí (la lógica), que se define bajo main, y
  • la parte llamada que comprueba si main existe

esencialmente escribe su programa bajo main, el uso de todas las funciones que ha definido justo antes de definir main (o en otro lugar), y dejar que Python busque main.

1

No necesita agregar if __name__ == '__main__' para las secuencias de comandos que no están destinadas a ser parte de un proyecto más grande. Ver 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 sólo desea ejecutar un archivo, que puede tener cero repetitivo:

print 1 

y ejecutarlo con $ python your_file.py

Adding the shebang line#!/usr/bin/python y funcionando chmod +x print_one.py se obtiene la capacidad de funcionar con

./print_one.py

Finalmente, # coding: utf-8 le permite agregar unicode a su archivo si quiere poner ❤'s por todos lados.