Las importaciones relativas de Python ya no se desaconsejan enérgicamente, pero en ese caso se recomienda encarecidamente el uso de absolute_import.
Consulte esta discusión citando al propio Guido:
"¿No es esto mayormente histórico? Hasta que se implementó la nueva sintaxis de importación relativa, había varios problemas con las importaciones relativas. La solución a corto plazo fue recomendar no usarlas. La solución a largo plazo fue implementar una sintaxis inequívoca. Ahora es hora de retirar la anti-recomendación. Por supuesto, sin exagerar, todavía encuentro un gusto adquirido, pero tienen su lugar ".
El OP vincula correctamente el PEP 328 que dice:
Se presentaron varios casos de uso, el más importante de los cuales es poder reorganizar la estructura de paquetes grandes sin tener que editar subpaquetes. Además, un módulo dentro de un paquete no se puede importar fácilmente sin importaciones relativas.
También vea la pregunta casi duplicada Cuándo o por qué usar importaciones relativas en Python
Por supuesto que sigue en pie por cuestión de gustos. Si bien es más fácil mover el código con importaciones relativas, eso también podría romper cosas inesperadamente; y cambiar el nombre de las importaciones no es tan difícil.
Para forzar el nuevo comportamiento de PEP 328 use:
from __future__ import absolute_import
En este caso, la importación relativa implícita ya no será posible (por ejemplo, import localfile
ya no funcionará, solo from . import localfile
). Para un comportamiento limpio y a prueba de futuro, se recomienda utilizar absolute_import.
Una advertencia importante es que debido a PEP 338 y PEP 366 , las importaciones relativas requieren que el archivo python se importe como un módulo; no puede ejecutar un file.py que tenga una importación relativa o obtendrá un archivo ValueError: Attempted relative import in non-package
.
Esta limitación debe tenerse en cuenta al evaluar el mejor enfoque. Guido está en contra de ejecutar scripts desde un módulo en cualquier caso:
Soy -1 en esto y en cualquier otro giro propuesto de la maquinaria __ principal__. El único caso de uso parece ser ejecutar scripts que viven dentro del directorio de un módulo, lo que siempre he visto como un antipatrón. Para hacerme cambiar de opinión, tendrías que convencerme de que no lo es.
Se pueden encontrar discusiones exhaustivas sobre el tema en SO; re. Python 3 esto es bastante completo:
from _ import ...
, por lo que sus ejemplos seríanfrom .. import A
yfrom . import B