2012-08-14 13 views
12

tengo este paquete:pitón - importación absoluta para el módulo en el mismo directorio

mypackage/ 
    __init__.py 
    a.py 
    b.py 

Y quiero importar las cosas desde un módulo de al Módulo B, ¿tiene sentido escribir en el módulo B

from mypackage.a import * 

o debo utilizar

from a import * 

Ambas opciones funcionan, me pregunto que es mejor (el 2º marcas sentido porque está en el mismo nivel, pero estoy considerando el primero para evitar colisiones, por ejemplo, si el sistema se ejecuta desde una carpeta que contiene un archivo llamado a.py).

Respuesta

6

Puede usar el número 2 de manera segura porque no debería haber colisiones, siempre estará importando un módulo del mismo paquete que el actual. Tenga en cuenta que si su módulo tiene el mismo nombre que uno de los módulos de biblioteca estándar, se importará en lugar del estándar. De the documentation:

Cuando un módulo denominado spam es importado, el intérprete busca primero para un módulo integrado con ese nombre. Si no se encuentra, busca para un archivo llamado spam.py en una lista de directorios dada por la variable sys.path. sys.path se inicializa a partir de estos lugares:

  • el directorio que contiene la secuencia de comandos de entrada (o el directorio actual).
  • PYTHONPATH (una lista de nombres de directorio, con la misma sintaxis que la variable de shell
  • PATH).
  • el valor predeterminado dependiente de la instalación.

Después de la inicialización, programas de Python puede modificar sys.path. El directorio que contiene la secuencia de comandos que se ejecuta se coloca al principio de la ruta de búsqueda, antes que la ruta de la biblioteca estándar. Esto significa que los scripts en ese directorio se cargarán en lugar de los módulos de del mismo nombre en el directorio de la biblioteca. Este es un error a menos que el reemplazo sea . Consulte la sección Standard Modules para obtener más información sobre .

La opción from mypackage.a import * se puede utilizar por razones de consistencia en todo el proyecto. En algunos módulos, tendrá que hacer importaciones absolutas de todos modos. Por lo tanto, no tendrá que pensar si el módulo está en el mismo paquete o no y simplemente usar un estilo uniforme en todo el proyecto. Además, este enfoque es más confiable y predecible.

Python style guidelines no recomiendan el uso importaciones en relación con:

importaciones en relación con las importaciones intra-paquetes son muy poco ánimo. Utilice siempre la ruta absoluta del paquete para todas las importaciones.Incluso ahora que PEP 328 está completamente implementado en Python 2.5, su estilo explícito de importaciones se desaconseja activamente; Las importaciones absolutas son más portátiles y generalmente más legibles.

Desde python 2.5 se ha introducido una nueva sintaxis para intra-package relative imports. Ahora puede . para referirse al módulo actual y .. refiriéndose al módulo que está 1 nivel arriba.

from . import echo 
from .. import formats 
from ..filters import equalizer 
+3

¿Y cómo sabes que lo que sea que 'a' realmente es no es una colisión con un built-in? Las importaciones relativas implícitas fueron asesinadas por alguna razón, no son seguras. – MatthewWilkes

+0

Tiene razón, un módulo integrado simplemente se enmascarará con el que tenemos del mismo nombre. –

+0

"Las pautas de estilo de Python no recomiendan el primer enfoque:" Para mí, parece que recomiendan el 1er "Usar siempre la ruta absoluta del paquete para todas las importaciones" – banana

5

Debe usar from mypackage.a import things, you, want.

Existen dos problemas aquí, el principal es el relativo a las importaciones absolutas, cuya semántica cambió en Python 3, y se puede usar opcionalmente en Python 2.6 y 2.7 utilizando una importación __future__. Al usar mypackage.a, usted garantiza que obtendrá el código que realmente desea, y funcionará de manera confiable en futuras versiones de Python.

Lo segundo es que debe evitar importar *, ya que puede enmascarar otro código. ¿Qué ocurre si el archivo a.py obtiene una función llamada sum? Anularía silenciosamente al incorporado. Esto es especialmente malo cuando importa su propio código en otros módulos, ya que es muy posible que haya reutilizado nombres de variables o funciones.

Por lo tanto, solo debe importar las funciones específicas que necesita. Usar pyflakes en tu código fuente te avisará cuando tengas conflictos potenciales.

+2

+1. Por cierto, 'from __future__ import absolute_import' también funciona en python 2.5. – jfs

Cuestiones relacionadas