Importaciones relativas vs absolutas en Python

    Si bien puede poner proyectos simples en un solo archivo, la mayor铆a de los proyectos de desarrollo de Python requerir谩n varios archivos para mantenerlos manejables. Eso significa que necesita una forma de importar un archivo a otro. Sin embargo, muchos Pythonistas encuentran confusa la importaci贸n de archivos. Afortunadamente, es f谩cil si conoce la diferencia entre las distintas declaraciones de importaci贸n de Python.

    驴Qu茅 es la importaci贸n?

    Importar se refiere a permitir que un archivo de Python o un m贸dulo de Python acceda al script desde otro archivo o m贸dulo de Python. Solo puede usar funciones y propiedades a las que puede acceder su programa. Por ejemplo, si desea utilizar funcionalidades matem谩ticas, primero debe importar el paquete matem谩tico. Esto se debe a que debe definir todo lo que desea usar en Python antes de usarlos.

    Por ejemplo, Python dar铆a un NameError para el siguiente c贸digo:

    myPi = math.pi
    

    Esto se debe a que ni el math objeto ni sus propiedades y m茅todos est谩n disponibles de forma nativa para el lenguaje mismo. Usar el math objeto, primero debe importarlo.

    import math
    
    myPi = math.pi
    print myPi
    

    los import declaraci贸n agrega el objeto al alcance actual de su programa.

    C贸mo funcionan las importaciones

    los import Las declaraciones hacen mucho bajo el cap贸 para importar archivos o m贸dulos. Primero, buscan su m贸dulo o paquete en sys.modules, donde Python almacena su c贸digo previamente importado. Si Python no puede encontrar el m贸dulo all铆, buscar谩 en el Biblioteca est谩ndar de Python para ello. Si Python a煤n no puede encontrar el m贸dulo, pasar谩 por todo su espacio de almacenamiento, comenzando con el directorio actual y los que figuran en su system.path. Si el m贸dulo se encuentra en estos lugares, agregar谩 el m贸dulo a su programa, de lo contrario, dar谩 un ModuleNotFoundError.

    Sintaxis de declaraci贸n de importaci贸n

    Para importar un m贸dulo directamente, simplemente ponga el nombre del m贸dulo o paquete despu茅s del import palabra clave. Tenga en cuenta que esta declaraci贸n distingue entre may煤sculas y min煤sculas.

    import mymodule
    

    Sin embargo, Python ofrece una sintaxis m谩s sofisticada para importar c贸digo. Este segundo formato incluye el from palabra clave tambi茅n.

    from mypackage import mymodule
    

    En este formato, especificas tanto el m贸dulo como el c贸digo que deseas junto con su ubicaci贸n. Pones el nombre de tu c贸digo, m贸dulo o subpaquete para mymodule, y su ubicaci贸n para mypackage. Dicha declaraci贸n de importaci贸n es excelente si solo desea importar parte del c贸digo del paquete mencionado, y no el paquete en s铆.

    Incluso puede cambiar el nombre del m贸dulo incluyendo el as palabra clave.

    import mymodule as oMyFunction
    

    Tambi茅n puede utilizar el asterisco (*) como comod铆n. La siguiente declaraci贸n importar谩 todas las funciones y propiedades contenidas en el math paquete.

    from math import *
    

    Independientemente de la sintaxis, siempre debe seguir las recomendaciones importar las mejores pr谩cticas.

    Importaciones absolutas

    Las importaciones absolutas incluyen la ruta completa a su script, comenzando con la carpeta ra铆z del programa. Si bien debe separar cada carpeta por un punto, puede hacer que sea tan largo como lo necesite.

    Los siguientes son ejemplos de importaciones absolutas:

    from package1.firstmodule import firstmodule
    import package1.secondmodule.myfunction
    
    Ventajas y desventajas absolutas de la importaci贸n

    A diferencia de otros lenguajes, la mayor铆a de los desarrolladores de Python prefieren usar importaciones absolutas sobre sus primos relativos. Esto se debe a que las importaciones absolutas dejan muy claro lo que est谩 tratando de hacer. La ubicaci贸n real de sus archivos est谩 ah铆 en su c贸digo. De hecho, puede usarlos en cualquier parte de su c贸digo. Simplemente funcionar谩n.

    Sin embargo, las importaciones absolutas pueden ser bastante largas. Si su proyecto tiene subpaquetes en subpaquetes en subpaquetes, sus declaraciones de importaci贸n pueden expandirse m谩s all谩 de una sola l铆nea de c贸digo. Cuando eso sucede, es mucho mejor utilizar importaciones relativas.

    Tambi茅n puede descubrir un problema al iniciar su programa utilizando diferentes archivos de inicio. El int茅rprete de Python solo declara la carpeta actual del archivo inicial como su sys.path ra铆z del paquete. Esto est谩 bien si solo carga su programa usando archivos de la carpeta ra铆z. Esto es porque sys.path permanecer谩 est谩tico a lo largo de su gui贸n.

    Sin embargo, la situaci贸n cambia cuando inicia su programa desde una subcarpeta, o en cualquier otra situaci贸n donde su sys.path podr铆a cambiar. Entonces, su “carpeta ra铆z” es la subcarpeta. Debido a que no puede usar importaciones impl铆citas (como veremos a continuaci贸n), cualquier archivo fuera de la subcarpeta se vuelve inaccesible para su programa.

    Tiene dos soluciones para esto. Puede iniciar la secuencia de comandos de la subcarpeta como un m贸dulo importado o puede agregar sys.path directamente en su c贸digo.

    Por ejemplo:

    • Importaci贸n de m贸dulos como tiempo de ejecuci贸n: python -m packA.a2
    • Agregue sys.path antes de importar sus archivos:
    import os, sys
    sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
    from packA.subA import sa2
    

    Importaciones relativas

    Con las importaciones relativas, solo especifica d贸nde est谩n sus recursos en relaci贸n con el archivo de c贸digo actual. Puede hacer esto de forma impl铆cita o expl铆cita, aunque las importaciones relativas impl铆citas se eliminaron en Python 3.

    En cuanto a la sintaxis, las importaciones relativas utilizan la notaci贸n de puntos. Los puntos individuales representan el directorio del script actual. Dos puntos representan la carpeta principal. Los puntos de Thress significan el abuelo, etc. Es posible que est茅 familiarizado con este sistema si utiliza un sistema operativo similar a UNIX o la consola de Windows.

    Los siguientes son ejemplos de importaciones relativas:

    • Importaciones expl铆citas
    import other
    from . import some_class
    from .subA import sa1
    
    • Importaciones impl铆citas
    from .some_module import some_class
    import some_function
    import subA.sa1
    

    Importaciones relativas y sus ventajas y desventajas

    Las importaciones relativas rara vez crecen mientras las importaciones absolutas. Incluso pueden convertir una declaraci贸n absoluta rid铆culamente larga en algo tan simple como:

    from ..my_sub_package.my_module import my_function
    

    Sin embargo, tambi茅n ocultan las rutas a sus m贸dulos. Esto podr铆a estar bien si eres el 煤nico desarrollador, pero se complica si eres parte de un equipo de desarrollo donde la estructura de directorios real puede cambiar.

    驴Qu茅 importaci贸n usar?

    A menos que est茅 trabajando en un proyecto grande con varias capas de subpaquetes, siempre debe usar importaciones absolutas. De esa manera, cualquiera que lo mire entender谩 f谩cilmente su c贸digo, incluido usted mismo si vuelve a 茅l para actualizarlo m谩s tarde. Incluso si tiene rutas largas, debe intentar escribir su programa para usar solo declaraciones absolutas para simplificar su c贸digo y su vida.

    Conclusi贸n

    Como cualquier otro lenguaje de programaci贸n moderno, Python le permite importar c贸digo desde otros archivos o m贸dulos. Sin embargo, esto puede convertirse en un proceso confuso y propenso a errores, a menos que comprenda los conceptos detr谩s del sistema de importaci贸n.

    En este art铆culo, analizamos las diversas formas de importar c贸digo en nuestros programas Python, incluidas las importaciones absolutas y relativas. Tambi茅n comparamos los pros y los contras de cada uno, que tienen sus ventajas en diferentes casos de uso.

     

    Etiquetas:

    Deja una respuesta

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