Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: ^Tifa^ en 15 Agosto 2009, 19:30 pm



Título: Python, que es __name__ == "__main__"?
Publicado por: ^Tifa^ en 15 Agosto 2009, 19:30 pm
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.


Título: Re: Python, que es __name__ == "__main__"?
Publicado por: -Ramc- en 15 Agosto 2009, 20:09 pm
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.


Título: Re: Python, que es __name__ == "__main__"?
Publicado por: Novlucker en 15 Agosto 2009, 21:03 pm
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


Título: Re: Python, que es __name__ == "__main__"?
Publicado por: ^Tifa^ en 15 Agosto 2009, 21:33 pm
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:


Título: Re: Python, que es __name__ == "__main__"?
Publicado por: Novlucker en 16 Agosto 2009, 00:14 am
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


Título: Re: Python, que es __name__ == "__main__"?
Publicado por: 08l00D en 16 Agosto 2009, 08:05 am
Código:
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
Código:
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:
Código:
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 !


Título: Re: Python, que es __name__ == "__main__"?
Publicado por: Anibal784 en 16 Agosto 2009, 15:09 pm
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__.


Título: Re: Python, que es __name__ == "__main__"?
Publicado por: ^Tifa^ en 16 Agosto 2009, 20:17 pm
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)





Título: Re: Python, que es __name__ == "__main__"?
Publicado por: Anibal784 en 17 Agosto 2009, 03:54 am
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
  1. if __name__ == "__main__":
  2.    print "Estas a punto de ejecutar el programa"
  3.    main()
  4. elif __name__ == "modulo_de_algo":
  5.    initialize()
  6. else:
  7.    print "Tu programa esta mal configurado, debes llamar a tu modulo ...."
  8.  
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.


Título: Re: Python, que es __name__ == "__main__"?
Publicado por: ^Tifa^ en 19 Agosto 2009, 18:44 pm
Citar
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.


Título: Re: Python, que es __name__ == "__main__"?
Publicado por: Novlucker en 19 Agosto 2009, 19:08 pm
Si lo ejecutas puede o no ser el principal ... como te hemos dicho .. una cosa es tener el *.py y ejecutarlo directamente .. y otra cosa es importarlo desde otro script.

Un claro ejemplo sería el caso de un script que tiene un input para algo ... puede que si lo ejecutas "suelto" necesites que se ejecute ese input, para que la persona ingrese ese "algo", pero sin embargo si lo importas en otro script, seguramente ya le pases el "algo" como parámetro, sin necesidad del input

Código
  1. if __name__ == "__main__":
  2. a=input("Ingrese un valor")

Saludos


Título: Re: Python, que es __name__ == "__main__"?
Publicado por: ^Tifa^ en 22 Agosto 2009, 16:20 pm
Gracias chiquitos.... creo que me he aclarado  :-*   :-* 

Aunque me desenvuelvo de manera decente con Perl, me hace falta conocer este lenguaje para mi actual trabajo.

Se les agradece toda su explicacion ofrecida de manera gratuita  :)   son unos amores

 :-*