variable Variablennamen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Gast

Ich würde gerne variable Variablennamen (mit php: $$variablenname) benutzen und suche eine Lösung für Python.

Kann mir jemand helfen?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Gast,

die einzige Möglichkeit sehe ich über eval und exec. Z.B.:

Code: Alles auswählen

>>> a = 2
>>> b = "a"
>>> print eval(b)
2
>>> exec(b+"= 4")
>>> print a
4
>>>
ich kann zwar auch ein bissche php, habe aber variable Variablennamen noch nie gebraucht und verstehe ehrlichgesagt auch nicht wofür die gut sein sollen, solche sachen lassen sich doch mit Dictionarys viel besser und auch übersichtlicher lösen?


Gruß

Dookie
piddon
Gründer
Beiträge: 410
Registriert: Dienstag 30. Juli 2002, 18:03
Wohnort: Oestrich-Winkel
Kontaktdaten:

Variable Variablen sind, meiner Meinung nach, absolut schlechter Stil!

Wo bleibt die Übersicht? In der Mathematik wird ein 'x' ja auch nicht plötzlich zu einem 'w'.

Eine Variable ist nur ein Platzhalter, und den sollte man siche, bevor man anfängt zu Programmieren, im Entwurf und Design schon überlegen. Eindeutig sollte er sein, um damit die Wartbarkeit des Codes zu gewährleisten.

Also, ich würde nach einer Lösung suche, die keine Variablen Variabeln (was für ein Ausdruck ;) ) benutzt oder benötigt. Und eine solche Lösung gibt es GARANTIERT! :)
irc: #python.de @ irc.freenode.net | [url=http://pythonwiki.pocoo.org]python-wiki[/url] | [url=http://www.pythonwiki.de/PythonDeForum/Faq]python-forum FAQ[/url]
Gast

Das klingt super und ist genau das, was ich brauche!

Nur leider meint Zope:
Exec statements are not allowed.
bzw.:
global name 'eval' is not defined

Konkret habe ich das folgende Problem:
Ich habe in Zope Objekte, auf deren Werte ich in der Form

Code: Alles auswählen

 container.data.entry_XXX.wert 
zugreifen kann. Jetzt möchte ich alle Werte ausgeben und dachte, dass so etwas wie

Code: Alles auswählen

tmp = "%s%i%s" % ("container.data.entry_",i,".wert")
eval(tmp)
in einer Schleife eine klasse Lösung wäre ...

Bessere Vorschläge werden sehnsüchtigst erwartet ...
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

Ich verbesser mal deine Lösung, sofern ich darf ;) (kA obs geht :))

Code: Alles auswählen

tmp = str(container.data.entry_)+str(i)+".wert" 
eval(tmp)
Gast

muss ich eval() irgendwo explizit importieren?
Oder warum meint Zope "global name 'eval' is not defined"
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi nochmal,

exec und eval sind Builtinfunktionen von Python. Brauchen also nicht importiert zu werden. Leider kenn ich mich mit Zope nicht aus, aber mir stellen sich da noch ein paar Fragen.
Für mich schaut das so aus, als wäre container.data ein Objekt das "entry_xxx" Einträge als Attribute enthält. Eine, allerdings IMHO nicht sehr schöne Lösung währe die Liste der Attribute container.data.__dict__ zu duchforsten nach Einträgen deren Key mit "entry_" beginnen und deren werte dann auszugeben.

Code: Alles auswählen

entrys = filter(lambda x: x[:6] == "entry_", containter.data.__dict__.keys())
for entry in entrys:
    print container.data.__dict__[entry].wert
Du schreibst auch daß Du diese in einer Schleife ausgeben willst. Wenn die Objekte von selbergeschriebenen Programmen erzeugt werden, sollte es kein Problem sein statt den Einträgen entry_xxx eine Liste die dann über container.data.entry.wert z.B. angesprochen wird daraus zu machen.
Denkbar wäre auch eine Implementierung von container.data als Dictionary, dessen Einträge über container.data["entry_%i" %i].wert angesprochen werden.
Mir scheint Du hast da schon in der Implementation eine Hund drinn. Wenn Du mal näher beschreibst, was das Ganze eigentlich machen soll, können wir Dir sicher besser helfen.

Gruß

Dookie
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Verwendest Du sowas wie PythonScripts?

Da hast du dann nämlich kein "normales" sondern ein restricted python. Das kann so etwas wg. Security nicht. Ein Freund von mir hatte das Problem ... und zack waren die Security-Methoden aus dem Code entfernt. Wenn Du Interesse an so einem entfesselten Python als PythonScripts hast sags mir.
Gast

Ja, ohne die Verwendung von exec oder eval() komme ich nicht weiter ...

Wäre klasse, wenn Du mir da weiterhelfen könntest!
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Ich habe mein Profil (hier) geändert, sodaß meine Emailadresse angezeigt wird. Schreib mir eine Email (damit ich Deine Email-Adresse bekomme). Zum ins Netz stellen ist diese Modifikation einfach zu "brutal". Einige Zope-Jünger würden einen für sowas lynchen :)
Antworten