Python, que es __name__ == "__main__"?

Iniciado por ^Tifa^, 15 Agosto 2009, 19:30 PM

0 Miembros y 1 Visitante están viendo este tema.

^Tifa^

Es una pregunta extremadamente tonta lol...  ;D

Pero realmente como no he encontrado definicion exacta sobre el tema. En que ocasiones, para que y que significado tiene en Python hacer :

if __name__ == "__main__"

:)

Gracias.

-Ramc-

Es poco lo que he usado python así que no se para que sirve, pero, leyendo esto, creo que te puede aclarar algo:

http://effbot.org/pyfaq/tutor-what-is-if-name-main-for.htm
http://es.diveintopython.org/odbchelper_testing.html

En el segundo link que pongo dicen esto:
Citar¿Por qué esta sentencia if en concreto es un truco? Los módulos son objetos, y todos los módulos tienen un atributo __name__ incorporado. El atributo __name__ de un módulo depende de cómo se utiliza el módulo. Si se importa con import, __name__ es el nombre del fichero del módulo, sin la ruta al directorio ni la extensión. Pero también puede ejecutarse un módulo directamente como programa independiente, y en este caso __name__ adquiere un valor especial, __main__.
Según lo que entiendo, cuando el modulo es ejecutado, su atributo __name__ toma el valor "__main__" y si tenemos varios modulos, podemos comprobar cuál es el que se ejecutó.

A mi criterio esto puede servir para por ejemplo si tienes el programa ejecutandose desde un pyc o un ejecutable y lo pasan como argumento a un debugger ya no sería el __main__ y podrías comprobarlo o cosas de ese estilo, pero, igualmente no estoy seguro, que alguien que sepa lo afirme o contradiga.

Saludos.

Shhh... be vewy, vewy, quiet!  I'm hunting wabbits...
LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.

Novlucker

Cuando ejecutas un modulo directamente __name__ es igual (==) __main__, pero cuando lo importas, __name__ es igual al nombre del módulo.

Así que esa comparacíon sirve para saber si se esta ejecutando el módulo por separado .. o si se esta importando  :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

^Tifa^

Gracias mas o menos entiendo el concepto chikitines  :-*

Lo que aun me deja un poquito asi como vacia es el hecho de 'cuando utilizar esto' y 'para que?'

Es que no se, me han dados ganas asi como de aprender python de repente  :) igual no pretendo abandonar perl, pero es bonito conocer un lenguaje POO tambien y como perl no cumple a cien por cien este requisito, y C++ es muy complicado para mi cabeza  :-\  y php es mas dirigido a web y yo no soy amiga a la programacion web jejejejeje por eso estoy optando con python.

Hay muchos terminos que no conozco y voy asi indagando y buscando haber que hacen y para que, pero ese termino del __name__ aun no lo llevo asi tan claro de cuando debo y porque utilizarle... Ahi esta el dilema  :-\

Pero, aprecio mucho su ayuda chicos son un amor  :laugh:

Novlucker

Basicamente es por si quieres hacer uso de tu script como módulo .. o suelto por ahí ...

Si solo creas scripts puntualmente para una cosa ... entonces no será necesario ponerlo ... pero si creas scripts que sean "reusables", entonces ya es otra cosa  :P

Es para que si tienes un script ... en su ejecución el script diga ... "me están importando? o estoy funcionando solo?

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

08l00D

if __name__ == "__main__"
Esa comparacion es como si el modulo(donde este escrita) diga:
Si no eh sido importado hacer lo siguiente...

Yo diria que se deberia usar cuando haces un script que puede ser importado o no y se ejecute por si mismo....
por ejemplo imaginate que tienes un script con varias funciones y quieres que tu script pueda ser importado y las funciones puedan ser manejadas por otro modulo y quieres que tambien que si lo ejecutas directamente ejecute tal y tal funcion....
entonces pones el condicional.....
if __name__ == "__main__": #si me ejecuto directamente
      funcion1(arg1, arg2) #ejecutar funcion1
      funcion2()
      .....

si hicieras el programa para que solo se ejecute directamente y no sea necesario utilizarlo como modulo de importacion no es necesario usarlo ya que directamente para ejecutar tus propias funciones y usar tus propias clases dentro de tu script las llamas desde ahi, por ejemplo tienes

def sumar(num1, num2):
    return num1 + num2

def restar(num1, num2):
    return num1 - num2

resultado = sumar(5, 7) #estas ejecutando las funciones del modulo directamente

si este modulo es importado el interprete ejecutaria esa la sentencia "resultado = sumar(5, 7)" en el modulo que lo importo sin preguntarle si quiera al que lo importo si queria llamar a esa funcion....
entonces seria conveniente ponerle ese if ahi .... osea:

def sumar(num1, num2):
    return num1 + num2

def restar(num1, num2):
    return num1 - num2

if __name__ == '__main__': #si nos estamos ejecutando solos
    resultado = sumar(5, 7) #realizar mi suma


si el modulo es importado el valor del modulo deja de ser __main__ y pasa a ser el nombre del modulo por lo que si es importado la condicion no se cumple y por lo tanto no se ejecuta nuestra llamada a la funcion..

pd: tal vez no se note tanto el uso en el ejemplo de m... ese q puse pero creeme que es muy util ...

Saludos !

Anibal784

A veces se usa para poner el código de prueba de un módulo que no quieres que se ejecute cuando estás importando dicho módulo. Por ejemplo, tienes un archivo que guarda un montón de funciones y quieres probarlo, entonces haces todas las pruebas, pero si el módulo es importado no necesitas que esas pruebas se ejecuten, por lo que haces el if __name__.
El que llega sin que lo llamen, se va sin que lo echen.

Citar
Vos no la votaste por eso la tenes adentro.
Lo fino no es lo tuyo, y a mi me chupa un huevo, soy argentino y no peronista, y eso es lo que realmente te molesta.

^Tifa^

Entonces podria yo decir, que si utilizo la expresion if __name__ == "__main__" si importo un modulo independiente que yo cree en otro lado, me ahorro el hecho de tener que hacer en este nuevo script algo tipo:

print nombre_modulo_importado.Funcion(parametros)

por esto :

print Funcion(parametros)




Anibal784

No, la expresión if __name__ == "__main__": dice, si el módulo que estás ejecutando es el módulo principal, ejecutá el código que sigue.

No es ninguna directiva de compilador ni nada, incluso puedes decir, por ejemplo:
Código (python) [Seleccionar]

if __name__ == "__main__":
    print "Estas a punto de ejecutar el programa"
    main()
elif __name__ == "modulo_de_algo":
    initialize()
else:
    print "Tu programa esta mal configurado, debes llamar a tu modulo ...."

para obligar a que no cambien el nombre del archivo, en si, el intérprete de python va parseando el archivo y ejecutando las líneas que va encontrando, el if no está dentro de ninguna función o clase, por lo que la ejecuta, comprueba si el nombre del módulo es __main__ y de ser así ejecuta su interior, sino pasa a la siguiente línea del programa.
El que llega sin que lo llamen, se va sin que lo echen.

Citar
Vos no la votaste por eso la tenes adentro.
Lo fino no es lo tuyo, y a mi me chupa un huevo, soy argentino y no peronista, y eso es lo que realmente te molesta.

^Tifa^

CitarNo, la expresión if __name__ == "__main__": dice, si el módulo que estás ejecutando es el módulo principal, ejecutá el código que sigue.

Ok aunque por el momento no le veo mucha logica a esta definicion, puesto que si ejecuto x modulo como voy a preguntar en el codigo que si ese modulo es el principal haz tal cosa... si lo estoy ejecutando es porque es el principal no se  :-\  en fin ya veo como le doy la vuelta al asunto.