Was bedeutet " __import__('pkg_resources').declare_namespace(__name__)` tun?
In einigen __init__.py
- Dateien der Module, die ich sah, wie eine einzige Zeile:
__import__('pkg_resources').declare_namespace(__name__)
Was es macht und warum die Leute es verwenden? Nehme an, es ist im Zusammenhang mit dynamischen importieren und erstellen namespace zur Laufzeit.
- Vielleicht finden Sie diese Frage und Antwort hilfreich: stackoverflow.com/questions/5064951/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Läuft es auf zwei Dinge an:
__import__
ist eine Python-Funktion, die wird importieren eines Pakets mit einer Zeichenfolge, die als name für das Paket. Es gibt ein neues Objekt darstellt, das importierte Paket. Sofoo = __import__('bar')
importiert ein Paket namensbar
und speichern Sie einen Verweis auf die Objekte in einer lokalen Objektvariablefoo
.Vom setup-utils pkg_resources' Dokumentation
declare_namespace()
"Erklären[s], dass die gepunktete Paketname Namen ist ein "namespace-Paket", deren enthaltene Pakete und Module können sich auf unterschiedlichen Distributionen."So
__import__('pkg_resources').declare_namespace(__name__)
importieren die 'pkg_resources' - Paket in ein temporäres aus und rufen Sie dendeclare_namespace
Funktion gespeichert, die temporär (die__import__
- Funktion ist wahrscheinlich eher als dieimport
- Anweisung so, dass es keine extra-symbol Links über namedpkg_resources
). Wenn Sie diesen code inmy_namespace/__init__.py
, dann__name__
istmy_namespace
und dieses Modul wird in diemy_namespace
namespace-Paket.Sehen die setup-tools Dokumentation für mehr details
Sehen diese Frage für die Diskussion über die älteren Mechanismus für die Erreichung der gleichen Wirkung.
Sehen PEP 420 für den standardisierten Mechanismus, der eine ähnliche Funktionalität bietet, beginnend mit Python 3.3.
declare_namespace
nicht auf alle. Es ist nicht nur dump den Inhalt derpkg_resources
Modul in dem gewählten namespace;pkg_resources
ist nur das Modul wodeclare_namespace
kommt. Ein Paketfoo
verwenden würdepkg_resources.declare_namespace(__name__)
zu ermöglichen, deren Umsetzung aufgeteilt werden in mehrerefoo
Ordner. Ziehen Sie den Inhaltpkg_resources
sich in Ihrem Namensraum wäre völlig kontraproduktiv.Dies ist ein Weg, zu erklären, dass die so genannten "namespace packages" in Python.
Was sind diese und was ist das problem:
Stellen Sie sich vor, die Verteilung eines software-Produkts, die eine Menge von Funktionen, und nicht alle Menschen wollen alles haben, damit Sie es teilen, in Stücke schneiden und Schiff als optional-plugins.
Wollen Sie, dass Leute in der Lage sein zu tun
Ausreichend ist, wenn die Verzeichnisstruktur ist genau wie oben, nämlich
Aber was, wenn Sie versenden diese beiden plugins als separate python-Paketen, so dass Sie sich in zwei verschiedene Verzeichnisse? Dann Sie möchten
__import__('pkg_resources').declare_namespace(__name__)
in jedem Paket ist__init__.py
so, dass Python weiß, diese Pakete sind Teil einer größeren "namespace-Paket", in unserem Fall ist esyour_project.plugins
.Entnehmen Sie bitte den Dokumentation für mehr info.