Autor
|
Tema: Python, que es __name__ == "__main__"? (Leído 23,962 veces)
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Es una pregunta extremadamente tonta lol... 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.
|
|
|
En línea
|
|
|
|
-Ramc-
Desconectado
Mensajes: 495
|
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.htmhttp://es.diveintopython.org/odbchelper_testing.htmlEn el segundo link que pongo dicen esto: ¿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.
|
|
|
En línea
|
Shhh... be vewy, vewy, quiet! I'm hunting wabbits...LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
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 Saludos
|
|
|
En línea
|
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^
Desconectado
Mensajes: 2.804
|
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
|
|
|
En línea
|
|
|
|
Novlucker
Ninja y
Colaborador
Desconectado
Mensajes: 10.683
Yo que tu lo pienso dos veces
|
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 Es para que si tienes un script ... en su ejecución el script diga ... "me están importando? o estoy funcionando solo? Saludos
|
|
|
En línea
|
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
Desconectado
Mensajes: 168
|
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 !
|
|
|
En línea
|
|
|
|
Anibal784
Desconectado
Mensajes: 762
Yo no la vote, pero me la tengo que aguantar igual
|
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__.
|
|
|
En línea
|
El que llega sin que lo llamen, se va sin que lo echen. 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^
Desconectado
Mensajes: 2.804
|
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)
|
|
|
En línea
|
|
|
|
Anibal784
Desconectado
Mensajes: 762
Yo no la vote, pero me la tengo que aguantar igual
|
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: 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.
|
|
|
En línea
|
El que llega sin que lo llamen, se va sin que lo echen. 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^
Desconectado
Mensajes: 2.804
|
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. 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.
|
|
|
En línea
|
|
|
|
|
|