Saltar al contenido

Importación relativa absoluta vs. explícita del módulo de Python

La guía o código que hallarás en este post es la resolución más eficiente y válida que encontramos a tu duda o dilema.

Solución:

Las importaciones relativas de Python ya no se desaconsejan enfáticamente, pero en ese caso se recomienda encarecidamente usar absolute_import.

Por favor vea esta discusión citando al mismo Guido:

“¿No es esto principalmente histórico? Hasta que se implementó la nueva sintaxis de importación relativa, hubo varios problemas con las importaciones relativas. La solución a corto plazo fue recomendar no usarlas. La solución a largo plazo fue implementar una sintaxis inequívoca. Ahora es hora de retirar la anti-recomendación. Por supuesto, sin exagerar, todavía les encuentro un gusto adquirido, pero tienen su lugar”.

El OP vincula correctamente el PEP 328 que dice:

Se presentaron varios casos de uso, el más importante de los cuales es poder reorganizar la estructura de paquetes grandes sin tener que editar subpaquetes. Además, un módulo dentro de un paquete no puede importarse fácilmente sin importaciones relativas.

También vea la pregunta casi duplicada Cuándo o por qué usar importaciones relativas en Python

Por supuesto, sigue en pie como una cuestión de gusto. Si bien es más fácil mover el código con importaciones relativas, eso también podría romper cosas inesperadamente; y cambiar el nombre de las importaciones no es tan difícil.

Para forzar el nuevo comportamiento de PEP 328 use:

from __future__ import absolute_import

En este caso, la importación relativa implícita ya no será posible (p. import localfile ya no funcionará, solo from . import localfile). Para un comportamiento limpio y a prueba de futuro, se recomienda utilizar absolute_import.

Una advertencia importante es que debido a PEP 338 y PEP 366, las importaciones relativas requieren que el archivo python se importe como un módulo; no puede ejecutar un file.py que tenga una importación relativa o obtendrá un ValueError: Attempted relative import in non-package.

Esta limitación debe tenerse en cuenta al evaluar el mejor enfoque. Guido está en contra de ejecutar scripts desde un módulo en cualquier caso:

Soy -1 en esto y en cualquier otro retoque propuesto de la maquinaria __principal__. El único caso de uso parece ser ejecutar scripts que viven dentro del directorio de un módulo, que siempre he visto como un antipatrón. Para hacerme cambiar de opinión tendrías que convencerme de que no lo es.

Se pueden encontrar discusiones exhaustivas sobre el tema en SO; re. Python 3 esto es bastante completo:

  • Importaciones relativas en Python 3

Importaciones absolutas. De PEP 8:

Se desaconsejan encarecidamente las importaciones relativas para las importaciones intrapaquete. Utilice siempre la ruta absoluta del paquete para todas las importaciones. Incluso ahora que PEP 328 [7] está completamente implementado en Python 2.5, su estilo de importaciones relativas explícitas se desaconseja activamente; Las importaciones absolutas son más portátiles y, por lo general, más legibles.

Las importaciones relativas explícitas son una buena característica del lenguaje (supongo), pero no son tan explícitas como las importaciones absolutas. La forma más legible es:

import A.A
import A.B.B

especialmente si importa varios espacios de nombres diferentes. Si observa algunos proyectos/tutoriales bien escritos que incluyen importaciones desde dentro de los paquetes, por lo general siguen este estilo.

Las pocas pulsaciones de teclas adicionales que realice para ser más explícito ahorrarán a otros (y quizás a usted) mucho tiempo en el futuro cuando intenten averiguar su espacio de nombres (especialmente si migra a 3.x, en el que parte del paquete los nombres han cambiado).

Las importaciones relativas no solo lo dejan libre para cambiar el nombre de su paquete más tarde sin cambiar docenas de importaciones internas, sino que también he tenido éxito con ellas al resolver ciertos problemas que involucran cosas como importaciones circulares o paquetes de espacio de nombres, porque no envían Python “de vuelta al top” para iniciar la búsqueda del siguiente módulo nuevamente desde el espacio de nombres de nivel superior.

Valoraciones y comentarios

Si aceptas, tienes la opción de dejar un ensayo acerca de qué te ha gustado de esta noticia.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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