22 votes

Le nom du module est différent du nom du répertoire ?

Supposons que j'ai un paquet python appelé bestpackage .

La convention stipule que bestpacakge serait également un répertoire sur sys.path qui contient un __init__.py pour que l'interpréteur suppose qu'il peut être importé.

Existe-t-il un moyen de définir une variable pour le nom du paquet afin que le répertoire puisse être nommé différemment de la directive avec laquelle je l'importe ? Existe-t-il un moyen de faire en sorte que l'espacement des noms ne tienne pas compte du nom du répertoire et qu'il respecte une autre configuration à la place ?

Mes développeurs côté client super branchés sont tellement amoureux de ces sexy something.otherthing.js des noms de projets pour l'un de nos petits projets secondaires !

EDIT :

Pour clarifier, le but principal de ma question était de permettre à mes clients de continuer à appeler les répertoires dans leur dossier "projects" (celui que nous avons tous ajouté à nos chemins) en utilisant leur convention existante (some.app.js), même si dans certains cas il s'agit en fait de paquets python qui seront sur le chemin et dont la source sera import les déclarations en interne. Je me rends compte que c'est en pratique une chose assez horrible et je demande donc plus par curiosité. Donc, une partie du gros problème ici est de contourner le fait que la fonction . dans le nom du répertoire (et donc le nom du paquet supposé) implique un accès par attribut. Je ne suis pas vraiment surpris que cela ne puisse pas être contourné, j'étais juste curieux de savoir si c'était possible plus profondément dans la "magie" derrière l'importation.

Il y a quelques bonnes réponses ici, mais toutes reposent sur une importation classique où l'accesseur d'attribut . entreront en conflit avec les noms des répertoires.

16voto

Martijn Pieters Points 271458

Un répertoire avec un __init__.py est appelé un paquet .

Et non, le nom du paquet est siempre le même que le répertoire. C'est ainsi que Python peut découvrir des paquets, il les fait correspondre aux noms de répertoire trouvés sur le chemin de recherche, et s'il y a un fichier __init__.py dans ce répertoire, il a trouvé une correspondance et importe le fichier __init__.py fichier contenu.

Vous pouvez toujours importer quelque chose dans l'espace de noms de votre module local sous un nom plus court et plus facile à utiliser en utilisant la commande from module import something ou le import module as alias la syntaxe :

from something.otherthing.js import foo
from something.otherthing import js as bar
import something.otherthing.js as hamspam

5voto

User Points 5627

Il existe une solution qui nécessite une importation initiale quelque part.

>>> import sys
>>> sys.modules['blinot_existing_blubb'] = sys
>>> import blinot_existing_blubb
>>> blinot_existing_blubb
<module 'sys' (built-in)>

Sans une modification du mécanisme d'importation, vous ne pouvez pas importer à partir d'un autre nom. Ceci est destiné, je pense, à rendre Python plus facile à comprendre.

Cependant, si vous souhaitez modifier le mécanisme d'importation, je vous recommande de procéder ainsi : Tirer le meilleur parti des importations Python

2voto

Silas Ray Points 11950

Eh bien, d'abord je dirais que Python is not Java/Javascript/C/C++/Cobol/YourFavoriteLanguageThatIsntPython . Bien sûr, dans le monde réel, certains d'entre nous doivent répondre à des patrons qui ne sont pas d'accord. Donc, si tout ce que vous voulez, c'est un peu d'indirection, utilisez de la poudre aux yeux, tant qu'ils ne prêtent pas trop attention à ce qui se trouve sous le capot. Écrivez votre module à la manière de Python, puis fournissez une API sur le côté dans le style lourd en points que vos collègues veulent. Ex :

pythonic_module.py

def func_1():
    pass

def func_2():
    pass

def func_3():
    pass

def func_4():
    pass

indirection

/dotty_api_1/__init__.py

from pythonic_module import func_1 as foo, func_2 as bar

/dotty_api_2/__init__.py

from pythonic_module import func_3 as foo, func_4 as bar

Aujourd'hui, ils peuvent s'en donner à cœur joie, mais vous pouvez écrire des choses à la manière de Python sous le capot.

1voto

Don Question Points 3856

En fait, oui ! vous pouvez faire un canonical import Whatever ou newmodulename = __import__("Whatever")

python garde la trace de vos modules et vous pouvez l'inspecter en faisant :

import sys
print sys.modules

Véase cet article plus de détails

Mais ce n'est peut-être pas votre problème. Imaginons que vous ayez un module dans un chemin différent, auquel votre projet actuel ne peut pas accéder parce qu'il n'est pas dans le chemin du système ?

Eh bien, il suffit d'ajouter :

import sys
sys.path.append('path_to_the_other_package_or_module_directory')

avant votre import ou voir ce SO- poste pour une solution plus permanente.

1voto

Gringo Suave Points 5985

Je cherchais à ce que cela se produise avec setup.py au moment de sdist et de l'installation, plutôt qu'au moment de l'exécution, et j'ai trouvé cette directive package_dir :

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