Seite 1 von 1

Variable Variablen like PHP

Verfasst: Samstag 23. Juli 2005, 09:19
von x-herbert
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...

Verfasst: Samstag 23. Juli 2005, 10:06
von jens

Verfasst: Samstag 23. Juli 2005, 13:01
von Leonidas
Das sieht in PHP etwas arg.. strange aus. Für die meisten Aufgaben ist in Python deshalb dict besser geeignet.

Re: Variable Variablen like PHP

Verfasst: Samstag 23. Juli 2005, 21:51
von BlackJack
x-herbert hat geschrieben: PS: wenn jemand fragt, für was man das braucht, erkläre ich das auch...
Na dann frage ich mal. Und ich schliesse mich meinem Vorredner an: Dictionaries sind toll. :wink:

Verfasst: Montag 25. Juli 2005, 20:56
von x-herbert
@ 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.

Code: Alles auswählen

def makephpvar(name, value):
    exec("%s = %s" % (name, repr(value))) in globals()

var = "hello"
makephpvar(var, "world")
print hello

# >>> world
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...

Verfasst: Montag 25. Juli 2005, 22:18
von BlackJack
x-herbert hat geschrieben:@ blackjack
vielleicht gehts auch mit Dict's...
Ganz bestimmt geht es auch mit dict().
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
Was spricht gegen:

Code: Alles auswählen

row = dict()
row['hello'] = 'world'
print row['hello']
Weniger Magie und damit auch einfacher nachzuvollziehen.
Ein typisches Anwendungsbeispiel ist die Ausgabe aus einer Datenbank, wobei die Tabellenüberschriften Variable werden und die Zeileninhalte die Werte.
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.
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"
Dem konnte ich jetzt nicht ganz folgen!? Kannst Du ein konkretes Beispiel posten?
Viele Wege führen nach Rom...
Variable Variablen sind eine dunkle, gefährliche Seitengasse, die ziemlich übel riecht. Zumindest aus der Sicht eines Pythonistas. :wink:

Verfasst: Dienstag 26. Juli 2005, 07:54
von x-herbert
Beispiel kommt...

Verfasst: Mittwoch 27. Juli 2005, 15:43
von Leonidas
BlackJack hat geschrieben:Variable Variablen sind eine dunkle, gefährliche Seitengasse, die ziemlich übel riecht. Zumindest aus der Sicht eines Pythonistas. :wink:
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.

Verfasst: Donnerstag 28. Juli 2005, 11:05
von x-herbert
Beispiel:

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) 

....
aber wie gesagt, geht sicher auch anders... ;-)

Verfasst: Donnerstag 28. Juli 2005, 11:39
von jens
x-herbert hat geschrieben:aber wie gesagt, geht sicher auch anders... ;-)
Evtl. mit setattr( object, name, value): http://www.python.org/doc/current/lib/b ... tml#l2h-61

Verfasst: Donnerstag 28. Juli 2005, 21:05
von x-herbert
im Prinzip schon...

Code: Alles auswählen

class X: pass
x = X()
setattr(x, 'foobar', 123)

print x.foobar

# >>> 123
nur muss ich dann immer das "x." mit "rumschleppen" was aber unterm Strich kein Problem ist...

Verfasst: Donnerstag 28. Juli 2005, 21:36
von BlackJack
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):

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))
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.

Verfasst: Freitag 29. Juli 2005, 06:24
von jens
x-herbert hat geschrieben:

Code: Alles auswählen

def makephpvar(name, value):
    exec("%s = %s" % (name, repr(value))) in globals()
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...