Hi,
gibt es in Python "variable Variablen" wie in PHP (siehe http://php3.de/manual/de/language.varia ... riable.php)?
Gruss x-herbert
PS: wenn jemand fragt, für was man das braucht, erkläre ich das auch...
Variable Variablen like PHP
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Meinst du das: http://www.python-forum.de/viewtopic.php?t=3624
Na dann frage ich mal. Und ich schliesse mich meinem Vorredner an: Dictionaries sind toll.x-herbert hat geschrieben: PS: wenn jemand fragt, für was man das braucht, erkläre ich das auch...

@ jens:
nö, habe zwar nicht alles gelesen - glaube aber nicht...
@ blackjack
vielleicht gehts auch mit Dict's...
der Befehl "exec" ist die Lösung z.B.
Ein typisches Anwendungsbeispiel ist die Ausgabe aus einer Datenbank, wobei die Tabellenüberschriften Variable werden und die Zeileninhalte die Werte. In meinem Beispiel habe ich eine Inidatei mit "Option = Value" angaben. Für die Zuordnung im Script muss ich für die "Variable = Wert"-Zuordnung diverse "if variable = Option"-Abfragen machen. Mit variablen (oder dynamischen) Variablen passiert das normalerweise innerhalb von einer "zweizeilen-Schleife"
Beispiel:
ini
[meinewerte]
var1 = 123
var2 = weqrq qwer
var3 = 30392
script
"variable variablen Schleife"
print var1 #>>> 123
print var2 # >>> weqrq qwer
print var3 # >>> 30392
Viele Wege führen nach Rom...
nö, habe zwar nicht alles gelesen - glaube aber nicht...
@ blackjack
vielleicht gehts auch mit Dict's...
der Befehl "exec" ist die Lösung z.B.
Code: Alles auswählen
def makephpvar(name, value):
exec("%s = %s" % (name, repr(value))) in globals()
var = "hello"
makephpvar(var, "world")
print hello
# >>> world
Beispiel:
ini
[meinewerte]
var1 = 123
var2 = weqrq qwer
var3 = 30392
script
"variable variablen Schleife"
print var1 #>>> 123
print var2 # >>> weqrq qwer
print var3 # >>> 30392
Viele Wege führen nach Rom...
gruss x-herbert
Ganz bestimmt geht es auch mit dict().x-herbert hat geschrieben:@ blackjack
vielleicht gehts auch mit Dict's...
Was spricht gegen:der Befehl "exec" ist die Lösung z.B.Code: Alles auswählen
def makephpvar(name, value): exec("%s = %s" % (name, repr(value))) in globals() var = "hello" makephpvar(var, "world") print hello # >>> world
Code: Alles auswählen
row = dict()
row['hello'] = 'world'
print row['hello']
Das heisst wenn sich die Tabelle ändert, dann ändern sich im Skript die Variablennamen. Das kann zum Beispiel zu Namenskollisionen führen oder zu Namen die keine gültigen Variablenbezeichner sind.Ein typisches Anwendungsbeispiel ist die Ausgabe aus einer Datenbank, wobei die Tabellenüberschriften Variable werden und die Zeileninhalte die Werte.
Dem konnte ich jetzt nicht ganz folgen!? Kannst Du ein konkretes Beispiel posten?In meinem Beispiel habe ich eine Inidatei mit "Option = Value" angaben. Für die Zuordnung im Script muss ich für die "Variable = Wert"-Zuordnung diverse "if variable = Option"-Abfragen machen. Mit variablen (oder dynamischen) Variablen passiert das normalerweise innerhalb von einer "zweizeilen-Schleife"
Variable Variablen sind eine dunkle, gefährliche Seitengasse, die ziemlich übel riecht. Zumindest aus der Sicht eines Pythonistas.Viele Wege führen nach Rom...

-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Da hat BlackJack absolut recht, ich würde Panikattaken bekommen wenn ich einen Code schreiben müsste und mit exec und sich dazu noch ändernden Variablennamen jonglieren müsste.BlackJack hat geschrieben:Variable Variablen sind eine dunkle, gefährliche Seitengasse, die ziemlich übel riecht. Zumindest aus der Sicht eines Pythonistas.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Beispiel:
aber wie gesagt, geht sicher auch anders... 
Code: Alles auswählen
import os, sys, ConfigParser
config = ConfigParser.ConfigParser()
if len(sys.argv) > 1: # Parameter = ini-file
filename = sys.argv[1]
try:
file = open(filename, 'r')
config.readfp(file)
file.close()
except IOError, exc:
error = ("Unable to open file '%s'" % filename)
sys.exit()
# bisherige Variante
result = []
for o, v in config.items('XXX'):
if o == "folder": folder = v
if o == "dim": dim.set(v)
if o == "low": low.set(v)
if o == "wait": wait.set(v)
if o == "para": para.insert(0, v)
if o == "release": release.insert(0, v)
if o == "other": other.insert(0, v)
if o == "sexit": sexit.set(v)
# mit variablen Variablen
def makephpvar(name, value):
exec("%s = %s" % (name, repr(value))) in globals()
for o, v in config.items('XXX'):
makephpvar(o, v)
....

gruss x-herbert
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Evtl. mit setattr( object, name, value): http://www.python.org/doc/current/lib/b ... tml#l2h-61x-herbert hat geschrieben:aber wie gesagt, geht sicher auch anders...
im Prinzip schon...
nur muss ich dann immer das "x." mit "rumschleppen" was aber unterm Strich kein Problem ist...
Code: Alles auswählen
class X: pass
x = X()
setattr(x, 'foobar', 123)
print x.foobar
# >>> 123
gruss x-herbert
Du hast die Daten doch im `config` Objekt. Mit dem `variable Variablen` oder dem Objekt als Namensraum kopierst Du die nur um. Beides scheint mir nicht so viel Sinn zu machen und im Original scheinst Du noch andere Sachen zu machen, nämlich Werte auf Objekten zu setzten oder Listen zu erweitern.
Das könnte man auch so schreiben (ungetestet):
Man kann sicher mit `locals()` noch die Angabe des Objektnamens weglassen, so dass man nur über die Optionsnamen iterieren braucht, das funktioniert aber nur solange wie die Optionen den gleichen Namen haben wie die Objekte.
Das könnte man auch so schreiben (ungetestet):
Code: Alles auswählen
folder = config.get('XXX', 'folder')
for option_name, obj in (('dim', dim),
('low', low),
('wait', wait),
('sexit', sexit)):
obj.set(config.get('XXX', option_name))
for option_name, obj in (('para', para),
('release', release),
('other', other)):
obj.insert(0, config.get('XXX', option_name))
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Was mir dabei noch einfällt... Man sollte eingaben vom User immer halbwegs auf Plausibilität prüfen. Einmal aus Sicherheitsgründen, zum anderen, weil der User sonst keine Rückmeldung bekommt, ob er das Programm auch richtig benutzt...x-herbert hat geschrieben:Code: Alles auswählen
def makephpvar(name, value): exec("%s = %s" % (name, repr(value))) in globals()