108 votes

Importation absolue ou relative explicite d'un module Python

Je m'interroge sur la meilleure façon d'importer des paquets dans une application Python. J'ai une structure de paquetage comme celle-ci :

project.app1.models
project.app1.views
project.app2.models

project.app1.views importations project.app1.models y project.app2.models . Il y a deux façons de procéder qui me viennent à l'esprit.

Avec des importations absolues :

import A.A
import A.B.B

ou avec des importations relatives explicites, telles qu'introduites dans Python 2.5 avec PEP 328 :

# explicit relative
from .. import A
from . import B

Quelle est la façon la plus pythonique de procéder ?

145voto

Stefano Points 5188

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 :

64voto

Rafe Kettler Points 29389

Importations absolues. D'après le PEP 8 :

Les importations relatives pour les importations intra-emballage sont très élevées. déconseillées. Il faut toujours utiliser le chemin absolu du paquet pour toutes les importations. Même maintenant que la PEP 328 [7] est entièrement mise en œuvre dans Python 2.5, son style d'importations relatives explicites est activement déconseillé ; les importations absolues sont plus portables et généralement plus lisibles.

Les importations relatives explicites sont une fonctionnalité intéressante du langage (je suppose), mais elles sont loin d'être aussi explicites que les importations absolues. La forme la plus lisible est la suivante :

import A.A
import A.B.B

surtout si vous importez plusieurs espaces de noms différents. Si vous regardez des projets/tutoriels bien écrits qui incluent des importations à partir de paquets, ils suivent généralement ce style.

Les quelques touches supplémentaires que vous utiliserez pour être plus explicite permettront aux autres (et peut-être à vous-même) de gagner beaucoup de temps à l'avenir lorsqu'ils essaieront de comprendre votre espace de noms (en particulier si vous migrez vers la version 3.x, dans laquelle certains noms de paquets ont changé).

45voto

Brandon Rhodes Points 21188

Les importations relatives vous permettent non seulement de renommer votre paquetage ultérieurement sans modifier des dizaines d'importations internes, mais elles m'ont également permis de résoudre certains problèmes liés à des importations circulaires ou à des paquets d'espace de noms, car elles ne renvoient pas Python "au sommet" pour recommencer la recherche du module suivant à partir de l'espace de noms de premier niveau.

0voto

zwidny Points 1

Les importations relatives implicites ne doivent jamais être utilisées et ont été supprimées dans Python 3. http://legacy.python.org/dev/peps/pep-0008/#imports

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X