Variable Variablen like PHP

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
x-herbert
User
Beiträge: 59
Registriert: Mittwoch 27. November 2002, 20:52

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...
gruss x-herbert
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das sieht in PHP etwas arg.. strange aus. Für die meisten Aufgaben ist in Python deshalb dict besser geeignet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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:
x-herbert
User
Beiträge: 59
Registriert: Mittwoch 27. November 2002, 20:52

@ 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...
gruss x-herbert
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:
x-herbert
User
Beiträge: 59
Registriert: Mittwoch 27. November 2002, 20:52

Beispiel kommt...
gruss x-herbert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
x-herbert
User
Beiträge: 59
Registriert: Mittwoch 27. November 2002, 20:52

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... ;-)
gruss x-herbert
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
x-herbert
User
Beiträge: 59
Registriert: Mittwoch 27. November 2002, 20:52

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...
gruss x-herbert
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten