operator modules from another __all__ python package python-import

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



python packages (3)

Importaciones absolutas. De PEP 8:

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

Las importaciones relativas explícitas son una característica agradable 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 paquetes, generalmente siguen este estilo.

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

Me pregunto cuál es la mejor forma de importar paquetes en una aplicación de Python. Tengo una estructura de paquete como esta:

project.app1.models project.app1.views project.app2.models

project.app1.views importa project.app1.models y project.app2.models . Hay dos maneras de hacer esto que se me ocurren.

Con importaciones absolutas:

import A.A import A.B.B

o con importaciones relativas explícitas, como se introdujo en Python 2.5 con PEP 328 :

# explicit relative import ..A import .B

¿Cuál es la forma más pitónica de hacer esto?


Las importaciones relativas de Python ya no se desaconsejan enérgicamente, pero se recomienda encarecidamente usar absolute_import en ese caso.

Por favor, vea esta discusión citando al propio 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 usarlos. La solución a largo plazo fue implementar una sintaxis inequívoca. es hora de retirar la anti-recomendación. Por supuesto, sin exagerar, todavía los encuentro adquiridos, 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.

Ver también preguntas casi duplicadas Cuándo o por qué usar importaciones relativas en Python

Por supuesto, sigue siendo 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 inesperadamente las cosas; 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 (por ejemplo, import localfile ya no funcionará, solo from . import localfile ). Para un comportamiento limpio y futuro, es recomendable usar 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 se puede ejecutar un archivo.py que tenga una importación relativa o se 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:

Estoy -1 en esto y en cualquier otro twiddlings propuesto de la maquinaria __main__. El único caso de uso parece ser ejecutar secuencias de comandos que casualmente están viviendo 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 es así.

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


Las importaciones relativas no solo te permiten renombrar tu paquete más tarde sin cambiar docenas de importaciones internas, sino que también he tenido éxito en resolver ciertos problemas relacionados con importaciones circulares o paquetes de espacios de nombres, porque no envían Python "de vuelta al arriba "para comenzar de nuevo la búsqueda del próximo módulo desde el espacio de nombres de nivel superior.