Python: Key vom Dictionary interaktiv als Funktionsaufruf?
Hallo zusammen.
Ich habe noch nicht viel Erfahrung mit Python sammeln können, daher brauche ich kurz eure Hilfe. Ich habe ein Dictionary was in etwa so aussieht:
liste = {
'x':'Liefert mir den Alpha-Wert',
'y':'Gewinn',
'z':'Umsatzvalue'
}
Key stellt den Funktionsnamen dar, Value eben die Beschreibung der Funktion. Die Funktionen sind Teil einer Libary.
Ich möchte nun gerne in einer Schleife unter anderem sämtliche Funktionen der Liste aufrufen. Also quasi sowas wie
for k in liste:
lib.k()
Wie kann ich den Key so ummodeln, dass ich daraus einen realen Funktionsaufruf bekomme?
2 Antworten
Du meinst vermutlich sowas:
for k in liste:
getattr(lib, k)()
Siehe dir dazu mal die Built-in Function getattr() an:
https://docs.python.org/3/library/functions.html#getattr
Ansonsten könnte man auch überlegen, die Funktionen in einer entsprechenden Liste bzw. Dictionary zu hinterlegen. Die Werte in einem Dictionary müssen ja nicht unbedingt Strings sein, sondern können beispielsweise auch ganze Funktionen sein.
Nein, das war nur so eine Idee, die ich kurz hatte, dass du beispielsweise ein zweites Dictionary anlegen könntest...
funktionen = {'x': lib.x, 'y': lib.y, 'z': lib.z}
So dass du dann beispielsweise mit funktionen['x'] die entsprechende Funktion lib.x erhältst.
Oder du verwendest Objekte mit entsprechenden Attributen, sodass dann also beispielsweise liste['x'].description die Beschreibung ist und bei liste['x'].function die entsprechende Funktion lib.x hinterlegt ist.
Aber das waren eigentlich nur so ein paar kleine Gedanken, die mir nebenbei gekommen sind. Die Lösung mit getattr() halte ich in deinem Fall wahrscheinlich für besser.
Ach so. Ja, wäre grundsätzlich möglich. Da meine Liste aber um sehr vieles länger ist (an die 200 Keys/Values) wäre das unnötig viel Aufwand, da die erste genannte Variante ja klappt.
Vielen Dank noch mal! :)
>>> def sq(x):
... return x*x
...
>>> sq(2)
4
>>> d={'square':sq}
>>> d['square']
<function sq at 0x7f81c98cfa60>
>>> d['square'](5)
25
Ich denke mihisu meinte diese Möglichkeit. Es geht natürlich auch sowas:
>>> d['mul']=lambda x,y:x*y
>>> d['mul'](3,7)
21
Entsprechend:
>>> d['mul']
<function <lambda> at 0x7f81c98cfaf0>
Hier wird also eien anonyme Funktion im dict hinterlegt.
Wir wissen aber natürlich nicht genau, was Dir vorschwebt, es gibt auch Szenarien, da ist eien closure angenehmer oder man arbeitet mit decorator.
Danke auch dir für deine Antwort! :)
Ich denke, mit
getattr()
bin ich bereits bestens bedient. Alles andere wäre unnötig doppelt gemoppelt. Warum als value noch ein dictionary hinterlegen oder einen Querverweis? Ich bekomme ja so alles was ich brauche.
Trotzdem vielen Dank für deine Mühe.
bin kein python pro aber grundsätzlich solltest du den key als namen benutzen und die funktion als value packen
also wenn dein dict so aussieht (pseudocode):
{ print: arg => print arg }
solltest du das so aufrufen können:
print 'wpdojawpod'
Wie rum ich es in dem Dictionary abspeichere, sollte egal sein. Ich kann ja sowohl an den Key als auch den Value kommen und ich habe mich bewusst für diese Variante entschieden.
Die Frage war auch, wie ich aus dem String eine Referenz zur gleichnamigen Funktion bekomme. Also den Key als tatsächlichen Funktionsaufruf nutzen kann. Nicht wie ich den Funktionsnamen ausgebe. ^^
Trotzdem danke für deine Antwort.
Was meinst du damit? Sollte ich die liste entsprechend so aufbauen:
und das kann ich dann per
aufrufen oder wie sollte das aussehen?