Me pregunto cuál es la forma preferida de importar paquetes en una aplicación Python. Tengo una estructura de paquete como esta:
project.app1.models
project.app1.views
project.app2.models
project.app1.views
importaciones project.app1.models
y project.app2.models
. Hay dos formas 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
from .. import A
from . import B
¿Cuál es la forma más pitónica de hacer esto?
python
package
python-import
Daniel Hepper
fuente
fuente
from _ import ...
, por lo que sus ejemplos seríanfrom .. import A
yfrom . import B
import ..A
afrom .. import A
. Es notable que solo pasaron 9 años hasta que alguien se dio cuenta;)Respuestas:
Importaciones absolutas. Desde PEP 8:
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 redactados que incluyen importaciones desde dentro de los paquetes, generalmente siguen este estilo.
Las pocas pulsaciones de teclas adicionales que tome para ser más explícito ahorrarán a otros (y tal vez 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).
fuente
Las importaciones relativas de Python ya no se desaconsejan enérgicamente, pero en ese caso se recomienda encarecidamente el uso de absolute_import.
Consulte esta discusión citando al propio Guido:
El OP vincula correctamente el PEP 328 que dice:
También vea la pregunta casi duplicada Cuándo o por qué usar importaciones relativas en Python
Por supuesto que sigue en pie por cuestión de gustos. 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 (por ejemplo,
import localfile
ya no funcionará, solofrom . 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 archivo
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:
Se pueden encontrar discusiones exhaustivas sobre el tema en SO; re. Python 3 esto es bastante completo:
fuente
import .baz
Sin embargo, esta es solo una simplista de muchas situaciones similares descritas en el PEP.Las importaciones relativas no solo le permiten cambiar el nombre de su paquete más tarde sin cambiar docenas de importaciones internas, sino que también he tenido éxito con ellas para 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 desde el espacio de nombres de nivel superior.
fuente
python setup.py install
opython setup.py develop
por alguna razón), en esos casos bifurco el código fuente y lo agrego como un submódulo git. Cuando esos paquetes utilizan importaciones absolutas en su propio nombre de paquete, sus importaciones fallan. La única solución es utilizar importaciones relativas explícitas. Eso es lo que debería animarse, creo.