2011-04-27 18 views
17

Estoy cambiando un montón de código python antiguo que ocasionalmente se ejecuta en colisiones de nombres entre paquetes. Tengo una pregunta sobre cuándo se deben usar las importaciones absolutas y si sería apropiado importar los módulos del mismo nivel solo por nombre.Cuándo utilizar importaciones absolutas

/package/ 
/package/__init__.py 
/package/subA 
/package/subA/__init__.py 
/package/subA/moduleA.py 
/package/subA/moduleB.py 
/package/subB 
/package/subB/__init__.py 
/package/subB/moduleA.py 
/package/subB/moduleB.py 

Debería cada instrucción de importación dentro del paquete de aspecto:

import package.subX.moduleX 

o

from package.subX import moduleX 

¿Y en el subpaquete __init__.py archivos. ¿Sería erróneo en pocas palabras

import moduleA 
import moduleB 

O, en /package/subA/moduleA.py, sería erróneo en pocas palabras:

import moduleB 
+0

siempre se puede alias, así que si quieres ahorrar algunos personajes a lo largo de su código, como en 'de package.subA moduleA importación como a_moduleA' y' de package.subB moduleA importación como b_moduleA', parece un poco desordenado para mí, pero es otra opción ... – photoionized

+0

posible duplicado de [Importación relativa absoluta versus explícita del módulo de Python] (http://stackoverflow.com/questions/4209641/absolute-vs-expllicit-relative-import-of- python-module) – Stefano

Respuesta

22

importaciones en relación resultó ser una muy mala idea, a pesar de que fueron el comportamiento predeterminado por mucho tiempo. Puede encontrar bastantes preguntas en este sitio donde alguien simplemente nombró su archivo después de un módulo incorporado y rompió su aplicación con mensajes de error extraños.

Es por eso que siempre es bueno hacer importaciones absolutas al hacer referencia a su proyecto en todas partes, incluidos los paquetes.

En resumen, utilizar este estilo:

import myproject.mypackage 
from myproject.mypackage.myfile import MyClass 

Presupuesto de PEP8:

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 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.

+2

+1 con importaciones absolutas es fácil ver lo que obtendrás. – samplebias

+12

A partir del 21 de septiembre, esta respuesta es incorrecta porque PEP8 ha cambiado. Por ejemplo: "Sin embargo, las importaciones relativas explícitas son una alternativa aceptable a las importaciones absolutas, especialmente cuando se trata de diseños de paquetes complejos donde el uso de importaciones absolutas sería innecesariamente detallado". – glarrain

Cuestiones relacionadas