Recientemente actualicé versiones de pylint , un popular corrector de estilo Python.
Se ha vuelto balístico a lo largo de mi código, señalando lugares donde importo módulos en el mismo paquete, sin especificar la ruta completa del paquete.
El nuevo mensaje de error es W0403.
W0403: Importación relativa% r, debe ser% r
Se utiliza cuando se detecta una importación relativa al directorio del paquete.
Ejemplo
Por ejemplo, si mis paquetes están estructurados así:
/cake
/__init__.py
/icing.py
/sponge.py
/drink
y en el paquete de esponja escribo:
import icing
en lugar de
import cake.icing
Obtendré este error.
Si bien entiendo que no todos los mensajes de Pylint son de igual importancia, y no tengo miedo de descartarlos, no entiendo por qué esa práctica se considera una mala idea.
Esperaba que alguien pudiera explicar las trampas, para poder mejorar mi estilo de codificación en lugar de (como lo planeo hacer actualmente) desactivar esta advertencia aparentemente espuria.
fuente
import .icing
lugar defrom . import icing
from <> import
;import <>
Siempre es absoluto. Por supuesto, las importaciones absolutas pueden usarsefrom <> import
omitiendo los puntos principales. La razónimport .foo
está prohibida porque después deimport XXX.YYY.ZZZ
esoXXX.YYY.ZZZ
se puede usar en una expresión. Pero.moduleY
no es utilizable en una expresión.Hay algunas buenas razones:
Las importaciones relativas se rompen fácilmente cuando mueve un módulo.
Imagine que tiene un
foo.bar
, afoo.baz
y unbaz
módulo en su paquete.foo.bar
importacionesfoo.baz
, pero utilizando una importación relativa.Ahora bien, si se va a mover
foo.bar
abar
, su módulo de repente está importando una diferentebaz
!Las importaciones relativas son ambiguas. Incluso sin moverse por el
bar
módulo en el ejemplo anterior, un nuevo desarrollador que llegue a su proyecto podría ser perdonado por no darse cuenta de quebaz
realmente es enfoo.baz
lugar delbaz
paquete de nivel raíz .Las importaciones absolutas hacen explícito qué módulo se está utilizando. Y como
import this
predica, explícito es mejor que implícito.Python 3 ha deshabilitado las importaciones relativas implícitas por completo; las importaciones ahora siempre se interpretan como absolutas, lo que significa que en el ejemplo anterior
import baz
siempre se importará el módulo de nivel superior. Deberá utilizar la sintaxis de importación explícita en su lugar (from . import baz
).Transmitir el ejemplo de Python 2 a 3 generaría problemas inesperados, ya que el uso de importaciones absolutas ahora hará que su código esté preparado para el futuro.
fuente