2010-11-17 19 views
57

Me pregunto acerca de la forma preferida de importar paquetes en una aplicación Python. Tengo una estructura de paquetes de esta manera:Importación relativa absoluta versus explícita del módulo Python

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

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

Con importaciones en términos absolutos:

import A.A 
import A.B.B 

o con las importaciones en relación explícitos, como introducidas en Python 2.5 with PEP 328:

# explicit relative 
import ..A 
import .B 

¿Cuál es la forma más Pythonic para hacer esto?

Respuesta

28

Importaciones absolutas. De PEP 8:

importaciones en relación con las importaciones intra-paquete son altamente desanime. 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 fácil de leer 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 algunos de los nombres de los paquetes han cambiado).

+1

Sí, que no estaba allí la última vez que leí a través de PEP 8! –

+0

@Rafe, "mira algunos proyectos bien escritos ..." ¿Alguna sugerencia? – denis

+0

@Denis: Rietveld es el proyecto propio de Guido van Rossum, así que supongo que sería un buen lugar para buscar (http://code.google.com/p/rietveld/). La biblioteca estándar de Python no es tan buena, muchos de esos códigos no siguen las convenciones. –

27

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

+1

Este es el estilo desalentado según la guía de estilo de Python. Se nublan la legibilidad y no valen la "conveniencia" percibida a la que alude. Si necesita usar importaciones relativas para resolver un problema, entonces lo está haciendo mal. –

+7

Tenga en cuenta que su (Brandon Rhodes) comenta sobre la otra respuesta, con un enlace que muestra que ya no se desaconseja. –

+0

@RafeKettler ¿Puede explicar cómo usaría las importaciones absolutas en un paquete que está incluido en otro paquete? Las importaciones absolutas fallarán dentro del paquete interno porque no conocen el nuevo nivel superior. Las importaciones relativas continúan funcionando. Uno podría probablemente argumentar que el paquete no debería estar anidado dentro de otro en primer lugar, pero algunos códigos deben ser reutilizables y esto sucede mucho. Una gran cantidad de código reutilizado no está empaquetado para el público y, por lo tanto, no se proporciona como un paquete separado, por lo que los métodos ad-hoc como VCS import/submodules terminan siendo utilizados. – meowsqueak

89

Las importaciones relativas de Python ya no se desaconsejan enérgicamente, pero se recomienda enfáticamente el uso de absolute_import en ese caso.

favor ver this discussion citando el propio Guido:

"¿No es sobre todo histórica Hasta la nueva sintaxis relativa a importar se implementó había varios problemas con las importaciones en relación La solución a corto plazo fue?. para recomendar no usarlos. La solución a largo plazo fue implementar una sintaxis inequívoca. Ahora es el momento de retirar la anti-recomendación.Por supuesto, sin ir por la borda - Todavía los encuentro un gusto adquirido; pero tener su lugar."

El PO enlaza correctamente el PEP 328 que dice: se presentaron

varios casos de uso, el más importante de los cuales está siendo capaz de reorganizar la estructura de paquetes grandes sin tener que editar sub -packages. Además, un módulo dentro de un paquete no puede fácilmente importación por sí mismo sin la importación relativos.

ver también pregunta casi duplicado When or why to use relative imports in 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 uso:

from __future__ import absolute_import 

En este caso, la importación en relación implícita ya no será posible (por ejemplo import localfile no funcionará más, solamente 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 en relación requieren el archivo de Python para ser importado como un módulo - no se puede ejecutar un file.py que tiene una importación relativa o tendrá que obtener una 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:

Tengo -1 en este y en cualquier otro twiddlings propuesto de la maquinaria __main__. El único caso de uso parece ser la ejecución de scripts que casualmente se encuentran 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 amplia:

+8

Guido escribió eso en 2010 y todavía está en el PEP ? ¿Cómo podemos confiar en las PEP si están tan desactualizadas? – Jabba

+1

PEP son como enmiendas de los Estados Unidos en el sentido de que puede enmendar cosas. También hay muchos PEPS rechazados. Las PEP son propuestas. Pueden ser aceptados, rechazados o quedar obsoletos, lo que a menudo significa nueva PEP. PEP 8 es una guía de estilo por lo que se puede modificar en su lugar. – CppLearner

+2

Estoy confundido acerca de que "un módulo dentro de un paquete no puede importarse fácilmente ...". Nunca había escuchado sobre módulos importándose antes. – matiascelasco

Cuestiones relacionadas