Si Guido lui-même annonçait que la convention du domaine inverse devait être suivie, elle ne serait pas adoptée, sauf s'il y avait des changements significatifs dans la mise en œuvre de import
en python.
Considérez : python recherche un chemin d'importation à l'exécution avec un algorithme fail-fast ; java recherche un chemin avec un algorithme exhaustif à la fois à la compilation et à l'exécution. Allez-y, essayez d'organiser vos répertoires comme ceci :
folder_on_path/
com/
__init__.py
domain1/
module.py
__init__.py
other_folder_on_path/
com/
__init__.py
domain2/
module.py
__init__.py
Ensuite essayez :
from com.domain1 import module
from com.domain2 import module
Exactement l'une de ces déclarations réussira. Pourquoi ? Parce que soit folder_on_path
soit other_folder_on_path
est plus haut dans le chemin de recherche. Lorsque python voit from com.
il prend le premier paquet com
qu'il peut trouver. Si cela contient domain1
, alors le premier import
réussira ; sinon, il lance une ImportError
et abandonne. Pourquoi ? Parce que import
doit se produire à l'exécution, potentiellement à n'importe quel moment dans le flux du code (bien que le plus souvent au début). Personne ne veut une marche exhaustive dans l'arborescence à ce moment-là pour vérifier qu'il n'y a pas de correspondance possible. Il suppose que s'il trouve un paquet nommé com
, c'est le paquet com
.
De plus, python ne fait pas la distinction entre les déclarations suivantes :
from com import domain1
from com.domain1 import module
from com.domain1.module import variable
Le concept de vérifier que com
est le com
va être différent dans chaque cas. En java, vous devez vraiment traiter uniquement le deuxième cas, et cela peut être accompli en parcourant le système de fichiers (je suppose un avantage de nommer les classes et les fichiers de la même manière). En python, si vous essayiez d'accomplir l'importation avec rien d'autre que l'assistance du système de fichiers, le premier cas pourrait presque être transparent (le fichier init.py ne s'exécuterait pas), le deuxième cas pourrait être accompli, mais vous perdriez l'exécution initiale de module.py, mais le troisième cas est entièrement inatteignable. Le code doit s'exécuter pour que variable
soit disponible. Et c'est un autre point principal : import
fait plus que résoudre les espaces de noms, il exécute du code.
Maintenant, vous pourriez vous en sortir avec cela si chaque package python distribué exigeait un processus d'installation qui recherchait le dossier com
, puis le domain
, et ainsi de suite, mais cela rendrait considérablement plus difficile le packaging, détruirait la possibilité de glisser-déposer, et rendrait l'emballage et un énorme casse-tête.