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:
"Isso não é principalmente histórico? Até que a nova sintaxe de importação relativa fosse implementada, havia vários problemas com as importações relativas. A solução de curto prazo era recomendar não usá-las. A solução de longo prazo era implementar uma sintaxe inequívoca. Agora é hora de retirar a anti-recomendação. Claro, sem exagerar - ainda os considero um gosto adquirido; mas eles têm o seu lugar. "
O OP vincula corretamente o PEP 328 que diz:
Vários casos de uso foram apresentados, o mais importante deles é ser capaz de reorganizar a estrutura de grandes pacotes sem ter que editar subpacotes. Além disso, um módulo dentro de um pacote não pode ser facilmente importado sem importações relativas.
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á umValueError: 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:
Eu sou -1 nisso e em qualquer outra alteração proposta da máquina __main__. O único caso de uso parece ser a execução de scripts que vivem dentro de um diretório de módulo, que sempre vi como um antipadrão. Para me fazer mudar de ideia, você teria que me convencer de que não é.
Discussões exaustivas sobre o assunto podem ser encontradas no SO; ré. Python 3, isso é bastante abrangente:
from _ import ...
, então seus exemplos seriamfrom .. import A
efrom . import B