Les importations relatives en Python ne sont plus fortement déconseillées, mais l'utilisation d'absolute_import est fortement suggérée dans ce cas.
Voir cette discussion citant Guido lui-même :
"Ne s'agit-il pas d'une question essentiellement historique ? Jusqu'à la nouvelle syntaxe d'importation relative n'ait été mise en œuvre, les importations relatives posaient divers problèmes. Les La solution à court terme était de recommander de ne pas les utiliser. La solution à long terme était de mettre en place une syntaxe non ambiguë. Il est maintenant temps de retirer l'anti-recommandation. Bien sûr, sans tomber dans l'excès -- je les trouve encore un goût acquis, mais ils ont leur place".
Le PO établit correctement le lien entre le PEP 328 qui dit :
Plusieurs cas d'utilisation ont été présentés, la possibilité de réorganiser les st modifier les sous-paquets. En outre, un module à l'intérieur d'un paquet ne peut pas facilement être modifié. s'importer lui-même sans importations relatives.
Voir aussi la question presque identique Quand ou pourquoi utiliser les importations relatives en Python ?
Bien entendu, il s'agit toujours d'une question de goût. Bien qu'il soit plus facile de déplacer le code avec des importations relatives, cela peut aussi casser des choses de manière inattendue ; et renommer les importations n'est pas si difficile.
Pour forcer le nouveau comportement du PEP 328, utilisez :
from __future__ import absolute_import
Dans ce cas, l'importation relative implicite ne sera plus possible (ex. import localfile
ne fonctionnera plus, seul from . import localfile
). Pour un comportement propre et à l'épreuve du temps, il est conseillé d'utiliser absolute_import.
Une mise en garde importante s'impose : en raison de l'existence d'un PEP 338 y PEP 366 Les importations relatives exigent que le fichier python soit importé en tant que module - vous ne pouvez pas exécuter un fichier file.py qui a une importation relative ou vous obtiendrez une erreur de type ValueError: Attempted relative import in non-package
.
Cette limitation doit être prise en compte lors de l'évaluation de la meilleure approche. Guido n'est pas favorable à l'exécution de scripts à partir d'un module dans tous les cas :
Je suis -1 sur ce point et sur toute autre proposition de modification de la machinerie __main__. Le seul cas d'utilisation semble être l'exécution de scripts qui se trouvent dans le répertoire d'un module, ce que j'ai toujours considéré comme un anti-modèle. Pour me faire changer d'avis, il faudrait me convaincre que ce n'est pas le cas.
Des discussions exhaustives sur le sujet peuvent être trouvées sur SO ; re. Python 3, c'est très complet :