Estou me perguntando sobre a maneira preferida de importar pacotes em um aplicativo Python. Eu tenho uma estrutura de pacote como esta:
project.app1.models
project.app1.views
project.app2.models
project.app1.views
importações project.app1.models
e project.app2.models
. Há duas maneiras de fazer isso que vêm à mente.
Com importações absolutas:
import A.A
import A.B.B
ou com importações relativas explícitas, conforme apresentado no Python 2.5 com PEP 328 :
# explicit relative
from .. import A
from . import B
Qual é a maneira mais pítônica de fazer isso?
python
package
python-import
Daniel Hepper
fonte
fonte
from _ import ...
, então seus exemplos seriamfrom .. import A
efrom . import B
import ..A
parafrom .. import A
. Notável que levou apenas 9 anos até que alguém notasse;)Respostas:
Importações absolutas. Do PEP 8:
As importações relativas explícitas são um bom recurso de linguagem (eu acho), mas não são tão explícitas quanto as importações absolutas. A forma mais legível é:
import A.A import A.B.B
especialmente se você importar vários namespaces diferentes. Se você olhar para alguns projetos / tutoriais bem escritos que incluem importações de dentro de pacotes, eles geralmente seguem este estilo.
As poucas teclas extras que você toma para serem mais explícitas economizarão muito tempo para outros (e talvez você) no futuro, quando eles tentarem descobrir o seu namespace (especialmente se você migrar para 3.x, em que parte do pacote nomes mudaram).
fonte
As importações relativas de Python não são mais fortemente desencorajadas, mas o uso de absolute_import é fortemente sugerido nesse caso.
Por favor, veja esta discussão citando o próprio Guido:
O OP vincula corretamente o PEP 328 que diz:
Veja também a pergunta quase duplicada Quando ou por que usar importações relativas em Python
Claro que ainda é uma questão de gosto. Embora seja mais fácil mover o código com importações relativas, isso também pode quebrar coisas inesperadamente; e renomear as importações não é tão difícil.
Para forçar o novo comportamento do PEP 328, use:
from __future__ import absolute_import
Neste caso, a importação relativa implícita não será mais possível (por exemplo
import localfile
, não funcionará mais, apenasfrom . import localfile
). Para um comportamento limpo e à prova de futuro, o uso de absolute_import é aconselhável.Uma advertência importante é que, por causa do PEP 338 e PEP 366 , as importações relativas requerem que o arquivo python seja importado como um módulo - você não pode executar um file.py que tenha uma importação relativa ou você obterá um
ValueError: Attempted relative import in non-package
.Essa limitação deve ser levada em consideração ao avaliar a melhor abordagem. Guido é contra a execução de scripts de um módulo em qualquer caso:
Discussões exaustivas sobre o assunto podem ser encontradas no SO; ré. Python 3, isso é bastante abrangente:
fonte
import .baz
- esta é apenas uma situação simplista de muitas situações semelhantes descritas no PEP.As importações relativas não apenas deixam você livre para renomear seu pacote posteriormente sem alterar dezenas de importações internas, mas também tive sucesso com elas na solução de certos problemas envolvendo coisas como importações circulares ou pacotes de namespace, porque eles não enviam Python "de volta para o top "para iniciar a busca pelo próximo módulo novamente a partir do namespace de nível superior.
fonte
python setup.py install
oupython setup.py develop
por qualquer motivo), nesses casos eu bifurco o código-fonte e o adiciono como um submódulo git. Quando esses pacotes usam importações absolutas em seu próprio nome de pacote, suas importações falham. A única solução é usar importações relativas explícitas. Isso é o que deve ser encorajado, eu acho.