A importação relativa acontece sempre que você está importando um pacote em relação ao script / pacote atual.
Considere a seguinte árvore, por exemplo:
mypkg
├── base.py
└── derived.py
Agora, o seu derived.pyrequer algo de base.py. No Python 2, você pode fazer o seguinte (em derived.py):
from base import BaseThing
O Python 3 não suporta mais isso, pois não é explícito se você deseja o 'relativo' ou o 'absoluto' base. Em outras palavras, se houvesse um pacote Python baseinstalado no sistema, você pegaria o pacote errado.
Em vez disso, requer que você use importações explícitas que especificam explicitamente a localização de um módulo de maneira semelhante a caminho. Você derived.pyficaria assim:
from .base import BaseThing
O principal .diz 'importar basedo diretório do módulo'; em outras palavras, .basemapeia para ./base.py.
Da mesma forma, existe um ..prefixo que sobe na hierarquia de diretórios como ../(com ..modmapeamento para ../mod.py) e, em seguida, ...que sobe dois níveis ( ../../mod.py) e assim por diante.
Observe, no entanto, que os caminhos relativos listados acima eram relativos ao diretório em que o módulo atual ( derived.py) reside, não o diretório de trabalho atual.
A @BrenBarn já explicou o caso de importação em estrela. Para completar, terei que dizer o mesmo;).
Por exemplo, você precisa usar algumas mathfunções, mas você as usa apenas em uma única função. No Python 2, você tinha permissão para ser semi-preguiçoso:
def sin_degrees(x):
from math import *
return sin(degrees(x))
Observe que ele já dispara um aviso no Python 2:
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
No código moderno do Python 2, você deve e no Python 3 você deve:
def sin_degrees(x):
from math import sin, degrees
return sin(degrees(x))
ou:
from math import *
def sin_degrees(x):
return sin(degrees(x))