La importación relativa ocurre cada vez que importa un paquete relativo al script / paquete actual.
Considere el siguiente árbol, por ejemplo:
mypkg
├── base.py
└── derived.py
Ahora, tu derived.py
requiere algo de base.py
. En Python 2, podría hacerlo así (en derived.py
):
from base import BaseThing
Python 3 ya no admite eso, ya que no es explícito si desea el 'relativo' o 'absoluto' base
. En otras palabras, si hubiera un paquete de Python llamado base
instalado en el sistema, obtendría el incorrecto.
En cambio, requiere el uso de importaciones explícitas que especifiquen explícitamente la ubicación de un módulo en forma de ruta. Tu derived.py
se vería así:
from .base import BaseThing
El encabezado .
dice 'importar base
desde el directorio del módulo'; en otras palabras, .base
mapas a ./base.py
.
Del mismo modo, hay un ..
prefijo que sube la jerarquía del directorio como ../
(con ..mod
asignación a ../mod.py
), y luego ...
que sube dos niveles ( ../../mod.py
) y así sucesivamente.
Sin embargo, tenga en cuenta que las rutas relativas enumeradas anteriormente eran relativas al directorio donde derived.py
reside el módulo ( ) actual , no el directorio de trabajo actual.
@BrenBarn ya ha explicado el caso de importación estrella. Para completar, tendré que decir lo mismo;).
Por ejemplo, necesita usar algunas math
funciones, pero solo las usa en una sola función. En Python 2 se te permitía ser semi perezoso:
def sin_degrees(x):
from math import *
return sin(degrees(x))
Tenga en cuenta que ya activa una advertencia en Python 2:
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
En el código moderno de Python 2 debe hacerlo y en Python 3 debe hacer lo siguiente:
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
o:
from math import *
def sin_degrees(x):
return sin(degrees(x))
Para admitir Python 2 y Python 3, use importaciones relativas explícitas como se muestra a continuación. Son relativos al módulo actual. Han sido compatibles a partir de 2.5 .
fuente
import .brother
es una sintaxis no válida para python 2 y 3import ..uncle
. Fijo. ¡Oh, qué he estado pensando ... probablemente se distrajo con los caballeros que dicen Ni!Se agregó otro caso a la respuesta de Michał Górny:
Tenga en cuenta que las importaciones relativas se basan en el nombre del módulo actual. Dado que el nombre del módulo principal siempre es "
__main__
", los módulos destinados a usarse como módulo principal de una aplicación Python siempre deben usar importaciones absolutas.fuente