Programmgesteuertes Erstellen von Variablen in Python [duplizieren]

8

Ich habe eine Klasse namens Variable definiert als:

%Vor%

Ich möchte 26 einzelne Großbuchstaben-Instanzen der Variablen wie folgt erstellen:

%Vor%

Bisher habe ich verschiedene Lösungen ausprobiert, und das Beste, was ich mir ausgedacht habe, ist:

%Vor%

Dies läuft jedoch nicht und gibt mir diesen Fehler:

%Vor%

Was mache ich falsch?

    
deeb 01.02.2011, 05:23
quelle

6 Antworten

15
%Vor%

Ob das eine gute Idee ist, bleibt fraglich:)

Dies funktioniert nur für globals() (d. h. Modulebenezuweisungen), da die Sprachdefinition explizit angibt, dass das Ändern des von locals() zurückgegebenen Wörterbuchs den Wert lokaler Variablen möglicherweise nicht ändert.

Sie können auch etwas ähnliches mit dem __dict__ einer Klasse oder Instanz tun.

    
ncoghlan 01.02.2011, 05:39
quelle
7

Der mit Abstand sauberste Ansatz, den ich je gesehen habe, ist, Variablen (dh Attribute) direkt zu Ihrem Programm (dh dem Hauptmodul) hinzuzufügen, wie in eine andere Frage zu StackOverflow :

%Vor%

PS : Python-Core-Entwickler haben hart gearbeitet, um das Ändern von globals() zu ermöglichen (siehe Kommentare zu ncoghlans Antwort). Daher ist die Änderung von globals() eine Alternative. Ich bin mir nicht sicher, warum viele Leute das Gefühl haben, dass es nicht so sauber ist (vielleicht, weil die Tatsache, dass globals() geändert werden kann, nicht explizit dokumentiert wird?).

    
EOL 01.02.2011 08:35
quelle
4

Nun, es ist nicht schön, aber Sie können direkt auf das globals() Wörterbuch zugreifen:

%Vor%     
nimrodm 01.02.2011 05:40
quelle
3

Sie müssen dafür nicht exec verwenden, wie die anderen Antworten zeigen, aber hier ist das Problem mit Ihrem ursprünglichen Code:

%Vor%

Dies wird A = A , B = B usw. ausführen. Das mag zwar interessant sein, wenn Sie ein glühender Anhänger des Objektivismus sind, Python wird sich nicht allzu viel dafür interessieren.

Sie möchten das Variable() sachen in der exec haben, damit es wichtig ist:

%Vor%

Wenn Sie in Zukunft exec verwenden möchten, versuchen Sie es zunächst nicht. Zweitens, drucken Sie was Sie ausführen - das wird helfen, zu debuggen.

    
tkerwin 01.02.2011 05:51
quelle
2

Versuchen Sie nicht, dies in eine globale Variable einzubauen. Es ist schrecklich. Tun Sie dies stattdessen.

%Vor%

Sie greifen beispielsweise von variables['Q'] darauf zu.

Wenn Sie Attributzugriff wünschen, können Sie Folgendes tun:

%Vor%

und

%Vor%

Aber in diesem Fall würde ich lieber dynamisch in einer Variablen-Containerklasse erstellen.

%Vor%

Verwendung:

%Vor%

Einfach und sauber, keine hässlichen Hacks (gut, außer einem getattr, und es ist nicht so hässlich), und Sie müssen nicht einmal die Variablen machen, die Sie nicht brauchen.

    
Lennart Regebro 01.02.2011 09:22
quelle
0
%Vor%

Ich bin mir nicht sicher, warum du das machen willst.

    
carl 01.02.2011 05:33
quelle

Tags und Links