Atualizei recentemente as versões do pylint , um popular verificador de estilo Python.
Ele ficou balístico em todo o meu código, apontando lugares onde importo módulos no mesmo pacote, sem especificar o caminho completo do pacote.
A nova mensagem de erro é W0403.
W0403: Importação relativa% r, deve ser% r
Utilizado quando uma importação relativa ao diretório do pacote é detectada.
Exemplo
Por exemplo, se meus pacotes estiverem estruturados assim:
/cake
/__init__.py
/icing.py
/sponge.py
/drink
e no pacote de esponjas eu escrevo:
import icing
ao invés de
import cake.icing
Eu vou receber esse erro.
Embora eu entenda que nem todas as mensagens da Pylint são de igual importância e não tenho medo de descartá-las, não entendo por que essa prática é considerada uma péssima idéia.
Eu esperava que alguém pudesse explicar as armadilhas, para que eu pudesse melhorar meu estilo de codificação, em vez de (como eu atualmente planejo fazer) desativar esse aviso aparentemente falso.
fonte
import .icing
vez defrom . import icing
from <> import
;import <>
é sempre absoluto. Obviamente, importações absolutas podem ser usadasfrom <> import
omitindo os pontos iniciais. O motivoimport .foo
é proibido é porque depoisimport XXX.YYY.ZZZ
dissoXXX.YYY.ZZZ
é utilizável em uma expressão. Mas.moduleY
não é utilizável em uma expressão.Existem algumas boas razões:
As importações relativas quebram facilmente quando você move um módulo.
Imagine que você tem um
foo.bar
, umfoo.baz
e umbaz
módulo no seu pacote.foo.bar
importaçõesfoo.baz
, mas usando uma importação relativa.Agora, se você mudar
foo.bar
para obar
seu módulo, de repente está importando um diferentebaz
!As importações relativas são ambíguas. Mesmo sem mover o
bar
módulo no exemplo acima, um novo desenvolvedor que chega ao seu projeto pode ser perdoado por não perceber quebaz
é realmente ofoo.baz
lugar dobaz
pacote no nível raiz .Importações absolutas explicitam qual módulo está sendo usado. E, como
import this
prega, explícito é melhor que implícito.O Python 3 desativou completamente as importações relativas implícitas; agora as importações são sempre interpretadas como absolutas, o que significa que no exemplo acima
import baz
sempre importará o módulo de nível superior. Você precisará usar a sintaxe de importação explícita (from . import baz
).Portar o exemplo do Python 2 para o 3 levaria a problemas inesperados, o uso de importações absolutas agora tornará seu código à prova de futuro.
fonte