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.pyrequiere 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 baseinstalado 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.pyse vería así:
from .base import BaseThing
El encabezado .dice 'importar basedesde el directorio del módulo'; en otras palabras, .basemapas a ./base.py.
Del mismo modo, hay un ..prefijo que sube la jerarquía del directorio como ../(con ..modasignació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.pyreside 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 mathfunciones, 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 .brotheres 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