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é haceif __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 estoif
, 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.