Angenommen, ich habe mehrere Variablen oder Objekte in Python, a
, b
, c
, ...
Wie kann ich diese Variablen einfach in einen Namespace in Python ablegen und zu einem späteren Zeitpunkt wiederherstellen? (z. B. auf die gleiche Weise umschließt argparse
verschiedene Variablen in einen Namespace).
Hier sind zwei Beispiele, wie ich Dinge in und aus einem Namespace ablegen möchte:
Meine erste Frage ist: Ist das überhaupt in Python möglich? (beachte, dass die Methode dump_into_namespace
nicht direkt die Namen der Variablen erhält, zumindest soweit ich das beurteilen kann) .
Wenn die obige Antwort nein ist, wie könnte ich das mit einer solchen Schnittstelle machen?
%Vor%Wie würde dies auch mit einem Wörterbuch anstelle eines Namensraums gemacht?
Es gibt ein paar Threads, die relevant für einen dot-access von dynamisch definierten Variablen sind, aber ich glaube nicht, dass sie das Problem des Dumpings von Variablen behandeln:
Gibt es Bibliotheken, die diese Art des Zugriffs durch Punktnotation ermöglichen?
Es sieht so aus, als gäbe es eine Bibliothek, die in Python dot-barrierefreie Wörterbücher unterstützt, Bunch , aber ich bin es nicht sicher, dass es leicht unterstützen würde zu dumpen, wie ich es definiert habe.
Die folgende Lösung bietet eine Syntax, die Ihrer Anforderung sehr nahe kommt. Der einzige Unterschied besteht darin, dass Sie an die Funktionsumgebung übergeben müssen, in der die Variablen explizit definiert sind:
%Vor%Sie können dann die Variablen an Ihre Locals zurückgeben (sagen wir in einer anderen Funktion):
%Vor% Dank der Anregung von eyquem kann das noch kürzer sein. Die Idee ist, Variablen in self.__dict__
des 'dump' -Objekts zu setzen (Anmerkung: Syntax des Updates ändert sich hier):
Sie haben mehrere Möglichkeiten, Ihren 'Namespace' zu erstellen. Die einfachsten zwei sind:
Erstellen Sie eine schnelle benutzerdefinierte Klasse:
%Vor% Aufruf mit dump_into_namespace(a='a', b='b', c='c')
; Dies erfordert eine beliebige Anzahl von Schlüsselwortargumenten.
Verwenden Sie eine collections.namedtuple
-Klasse :
Aufruf mit dump_into_namespace('a', 'b', 'c')
; Dies erfordert nur eine feste Anzahl von Argumenten, aber Ihre dump_into_namespace()
-Funktion könnte Standardwerte liefern.
Was Sie Punktnotation nennen, ist wirklich nur Attributzugriff.
Um ehrlich zu sein, ist der einfachste Weg, sie einfach zuzuordnen:
%Vor% Sie können es nicht dynamischer machen, weil eine Variable ihren eigenen Namen nicht kennt. Sie müssten sie als Schlüsselwortargumente übergeben. In diesem Fall können Sie einfach den __dict__
des Namespace direkt aktualisieren:
und du würdest es wie folgt nennen:
%Vor%BEARBEITEN:
piokucs Antwort hat mich dazu inspiriert, die Umwelt zu berücksichtigen
Meine Lösung aktualisiert self ._ dict _ , so dass keine spezielle Funktion __getattr__
definiert werden muss: die an die Funktion übergebenen Objekte werden zu echten Attributen. Ihre Namen gehören zum Wörterbuch des erstellten Objekts.
Ergebnis
%Vor%In gewissem Sinne bilden die Attribute eines Objekts auch einen Namensraum.
Tags und Links python