驴Qu茅 hace si __name__ == “__main__”: Do en Python?

    Introducci贸n

    Es com煤n ver if __name__ == "__main__" en los scripts de Python que encontramos en l铆nea, o uno de los muchos que escribimos nosotros mismos.

    驴Por qu茅 usamos esa declaraci贸n if cuando ejecutamos nuestros programas Python? En este art铆culo, explicamos la mec谩nica detr谩s de su uso, las ventajas y d贸nde se puede utilizar.

    El atributo __name__ y el alcance __main__

    los __name__ El atributo viene por defecto como uno de los nombres en el 谩mbito local actual. El int茅rprete de Python agrega autom谩ticamente este valor cuando ejecutamos una secuencia de comandos de Python o importamos nuestro c贸digo como un m贸dulo.

    Pruebe el siguiente comando en su int茅rprete de Python. Puede descubrir que __name__ pertenece a la lista de atributos en dir():

    dir()
    

    los __name__ en Python es una variable especial que define el nombre de la clase o el m贸dulo actual o el script desde el que se invoca.

    Crea una nueva carpeta llamada name_scripts para que podamos escribir algunos scripts para comprender c贸mo funciona todo esto. En esa carpeta crea un nuevo archivo, script1.py con el siguiente c贸digo:

    print(f'The __name__ from script1 is "{__name__}"')
    

    隆Eso es una bola curva! Esperar铆amos que el nombre fuera script1, como nuestro archivo. 驴Qu茅 significa la salida __main__ 驴media?

    De forma predeterminada, cuando se ejecuta un script, el int茅rprete lee el script y asigna la cadena __main__ al __name__ palabra clave.

    Se vuelve a煤n m谩s interesante cuando el script anterior se importa a otro script. Considere un archivo de Python llamado script2.py con el siguiente c贸digo:

    import script1  # The print statement gets executed upon import
    
    print(f'The __name__ from script2 is "{__name__}"')
    

    Como puede ver, cuando se ejecuta el script, la salida se da como script1 que denota el nombre del gui贸n. La declaraci贸n final impresa est谩 en el alcance de script2 y cuando se ejecuta, la salida se imprime como: __main__.

    Ahora que entendemos c贸mo Python usa el __name__ scope y cuando le da un valor de “__main__”, veamos por qu茅 verificamos su valor antes de ejecutar el c贸digo.

    if __name__ == “__main__” en acci贸n

    Usamos la sentencia if para ejecutar bloques de c贸digo solo si nuestro programa es el programa principal ejecutado. Esto permite que nuestro programa sea ejecutable por s铆 mismo, pero compatible con otros m贸dulos de Python que quieran importar alguna funcionalidad sin tener que ejecutar el c贸digo.

    Considere los siguientes programas de Python:

    un) script3.py contiene una funci贸n llamada add() que se invoca solo desde el contexto principal.

    def add(a, b):
        return a+b
    
    
    if __name__ == "__main__":
        print(add(2, 3))
    

    Aqu铆 est谩 la salida cuando script3.py se invoca:

    Como el script se ejecut贸 directamente, el __name__ la palabra clave est谩 asignada a __main__, y el bloque de c贸digo debajo del if __name__ == "__main__" se ejecuta la condici贸n.

    b) Esto es lo que sucede cuando este fragmento se importa desde script4.py:

    import script3
    
    print(f"{script3.__name__}")
    

    El bloque debajo if __name__ == "__main__" desde script3.py no se ejecut贸, como se esperaba. Esto sucedi贸 porque el __name__ La palabra clave ahora se asigna con el nombre del script: script3. Esto puede ser verificado por la declaraci贸n de impresi贸n dada que imprime el valor asignado para el __name__ palabra clave.

    驴C贸mo ayuda __name__ == “__main__” en el desarrollo?

    Aqu铆 hay algunos casos de uso para usar esa declaraci贸n if al crear su script

    • Las pruebas son una buena pr谩ctica que ayuda no solo a detectar errores, sino tambi茅n a garantizar que su c贸digo se comporte seg煤n sea necesario. Los archivos de prueba tienen que importarles una funci贸n u objeto. En estos casos, normalmente no queremos que el script se ejecute como m贸dulo principal.
    • Est谩 creando una biblioteca, pero le gustar铆a incluir una demostraci贸n u otros casos especiales en tiempo de ejecuci贸n para los usuarios. Al usar esta declaraci贸n if, los m贸dulos de Python que usan su c贸digo como biblioteca no se ven afectados.

    Creaci贸n de un archivo __main__.py para m贸dulos

    El punto de tener el if __name__ == "__main__" bloque es obtener el fragmento de c贸digo bajo la condici贸n de ejecutarse cuando el script est谩 en el __main__ alcance. Sin embargo, al crear paquetes en Python, es mejor si el c贸digo se ejecutar谩 bajo la __main__ el contexto est谩 escrito en un archivo separado.

    Consideremos el siguiente ejemplo: un paquete para realizar c谩lculos. La estructura del 谩rbol de archivos para tal escenario se puede visualizar como:

    calc                 # --> Root directory
    鈹溾攢鈹 __main__.py
    鈹溾攢鈹 script1.py
    鈹溾攢鈹 script2.py
    鈹溾攢鈹 script3.py
    鈹溾攢鈹 script4.py
    鈹斺攢鈹 src              # --> Sub-directory
        鈹溾攢鈹 add.py
        鈹斺攢鈹 sub.py
    

    La estructura de 谩rbol contiene calc como el directorio ra铆z y un subdirectorio conocido como src. los __main__.py bajo la calc directorio contiene el siguiente contenido:

    from src.add import add
    from src.sub import sub
    
    a, b = input("Enter two numbers separated by commas: ").split(',')
    a, b = int(a), int(b)
    
    print(f"The sum is: {add(a, b)}")
    print(f"The difference is: {sub(a, b)}")
    

    los add.py contiene:

    def add(a, b):
        return a+b
    

    Y sub.py contiene:

    def sub(a, b):
        return a-b
    

    Desde fuera del calc directorio, el script se puede ejecutar y la l贸gica dentro del __main__.py se ejecuta invocando:

    python3 calc
    

    Esta estructura tambi茅n le da un aspecto m谩s limpio a la ubicaci贸n del espacio de trabajo, la forma en que se organizan los directorios y el punto de entrada se define dentro de un archivo separado llamado __main__.py.

    Conclusi贸n

    los __name__ == "__main__" ejecuta bloques de c贸digo solo cuando nuestro script Python se ejecuta directamente desde un usuario. Esto es poderoso ya que permite que nuestro c贸digo tenga un comportamiento diferente cuando se ejecuta como un programa en lugar de importarse como un m贸dulo.

    Al escribir m贸dulos grandes, podemos optar por el enfoque m谩s estructurado de tener un __main__.py archivo para ejecutar un m贸dulo. Para un script independiente, incluido el if __name__ == "__main__" es un m茅todo m谩s simple para separar la API del programa.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *