Python: Key vom Dictionary interaktiv als Funktionsaufruf?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.


GuteAntwort2021 
Fragesteller
 10.02.2022, 19:12

Danke dir! :) Hat perfekt funktioniert.

0
GuteAntwort2021 
Fragesteller
 10.02.2022, 19:20
Die Werte in einem Dictionary müssen ja nicht unbedingt Strings sein, sondern können beispielsweise auch ganze Funktionen sein.

Was meinst du damit? Sollte ich die liste entsprechend so aufbauen:

liste = {
	lib.x():'Liefert mir den Alpha-Wert',
    ...
}

und das kann ich dann per

for k in liste:
    k

aufrufen oder wie sollte das aussehen?

0
mihisu  10.02.2022, 19:33
@GuteAntwort2021

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.

2
GuteAntwort2021 
Fragesteller
 10.02.2022, 19:39
@mihisu

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! :)

0
KarlRanseierIII  10.02.2022, 19:42
@GuteAntwort2021
>>> 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.

2
GuteAntwort2021 
Fragesteller
 10.02.2022, 22:03
@KarlRanseierIII

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.

0

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'

Woher ich das weiß:Studium / Ausbildung

GuteAntwort2021 
Fragesteller
 10.02.2022, 19:22

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.

0