Qu'est-ce que__import__('pkg_resources').declare_namespace (___nom_)` faire?
Dans certains __init__.py
fichiers de modules je n'ai vu une seule ligne:
__import__('pkg_resources').declare_namespace(__name__)
Que fait-il et pourquoi les gens l'utilisent? Supposons que c'est lié à la dynamique de l'importation et de la création de l'espace de noms lors de l'exécution.
- Vous pourriez trouver cette question et de la réponse utile: stackoverflow.com/questions/5064951/...
Vous devez vous connecter pour publier un commentaire.
Il se résume à deux choses:
__import__
est une fonction Python qui va importer un package à l'aide d'une chaîne de caractères comme le nom du package. Il renvoie un nouvel objet qui représente le package importé. Doncfoo = __import__('bar')
d'importation d'un package nommébar
et stocker une référence à ses objets dans un objet local variablefoo
.À partir de l'installation utils pkg_resources' documentation,
declare_namespace()
"Déclarer[s] que le pointillé nom du package nom est un "espace de noms de package" dont le contenu des packages et modules peuvent être réparties entre plusieurs distributions."Donc
__import__('pkg_resources').declare_namespace(__name__)
à importer les 'pkg_resources' paquet dans un temporaire et d'appeler ladeclare_namespace
fonction stockée dans que temporaire (le__import__
fonction est probablement utilisé plutôt que leimport
déclaration pour qu'il n'y a aucun symbole à gauche sur nompkg_resources
). Si ce code était enmy_namespace/__init__.py
, puis__name__
estmy_namespace
et ce module sera inclus dans lemy_namespace
espace de noms de package.Voir le outils de configuration documentation pour plus de détails
Voir cette question pour la discussion sur l'ancien mécanisme pour atteindre le même effet.
Voir PEP 420 pour le mécanisme normalisé qui offre des fonctionnalités similaires début avec Python 3.3.
declare_namespace
le fait. Il n'est pas juste de vider le contenu de lapkg_resources
dans le module choisi d'espace de noms;pkg_resources
est juste le module oùdeclare_namespace
vient de. Un paquetfoo
serait d'utiliserpkg_resources.declare_namespace(__name__)
pour permettre sa mise en œuvre doit être divisé en plusieursfoo
dossiers. Tirant le contenu depkg_resources
dans votre espace de noms serait totalement contre-productif.C'est une façon de déclarer la soi-disant "espace de noms de paquets" en Python.
Quelles sont-elles et quel est le problème:
Imaginez que vous distribuer un produit logiciel qui a beaucoup de fonctionnalités, et pas tous les gens veulent tout avoir, si vous le découper en morceaux et de les expédier comme option plugins.
Vous voulez les gens à être en mesure de faire
Qui est très bien si votre structure de répertoire est exactement comme ci-dessus, à savoir
Mais que faire si vous expédier ces deux plugins séparer les paquets python de sorte qu'ils sont situés dans deux répertoires différents? Puis vous pourriez vouloir mettre
__import__('pkg_resources').declare_namespace(__name__)
dans chaque paquet__init__.py
de sorte que Python sait que les paquets qui font partie d'un plus grand "espace de noms de package", dans notre cas, c'estyour_project.plugins
.Veuillez vous référer à la la documentation pour plus d'info.