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.py
requer 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 base
instalado 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.py
ficaria assim:
from .base import BaseThing
O principal .
diz 'importar base
do diretório do módulo'; em outras palavras, .base
mapeia para ./base.py
.
Da mesma forma, existe um ..
prefixo que sobe na hierarquia de diretórios como ../
(com ..mod
mapeamento 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 math
funçõ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))
Para dar suporte ao Python 2 e Python 3, use importações relativas explícitas, como abaixo. Eles são relativos ao módulo atual. Eles foram suportados a partir do 2.5 .
fonte
import .brother
é sintaxe inválida para python 2 e 3 #import ..uncle
. Fixo. Oh, o que eu estava pensando ... provavelmente me distraí com os cavaleiros que dizem Ni!Foi adicionado outro caso à resposta de Michał Górny:
Observe que as importações relativas são baseadas no nome do módulo atual. Como o nome do módulo principal é sempre "
__main__
", os módulos destinados ao uso como módulo principal de um aplicativo Python devem sempre usar importações absolutas.fonte