Seite 1 von 1

dynamischer Methodenaufruf

Verfasst: Donnerstag 3. Juli 2008, 16:25
von da.dom
Hallo Zusammen,

schreibe gerade eine kleine ConsolenAnwendung. Klassisches Auswahl Menü, bei dem der Benutzer zahlen eintragen soll, welchen Programmteil er gerne benutzen will.

If-Else schleifen mit Methodenaufruf ist ja eher unschön, darum hatte ich mir erst sowas überlegt:

mit String und exec (Methode showRecipes wählt anhand des Parameters geringfügig unterschiedliche Abläufe aus)

Code: Alles auswählen

    execList=(None,"showRecipes(1)","showRecipes(2)", "showRecipes(3)", "addRecipes()","deleteRecipe()", "exitProgram()")
    exec execList[reciveAnInput()]
nicht sooo elegant oder? Dann ist mir ja eingefallen das ich mir die Methoden auch als Object geben lassen kann:

Code: Alles auswählen

    execList=(None,showRecipes...)
Aber an der Stelle hätte ich ja jetzt das Problem das ich den Parameter nur wieder durch IfElse Bedingungen setzen kann oder (wenn man mal bei dem Beispiel zufällig davon absieht das der Listen-Index = Parameter ist).

Frage: Kann man dem FunktionsObjekt schon bei der Erstellung einen Parameter geben?

Frage: oder wie löst man ein solches Auswahlmenü am elegantesten?

Danke (mal wieder)
D

Re: dynamischer Methodenaufruf

Verfasst: Donnerstag 3. Juli 2008, 16:37
von keppla
eine einfache Lösung wäre, dass du die Funktionen wrappst:

Code: Alles auswählen

def f1():
  return showRecipes(1)

def f2():
  return showRecipes(2)

execlist = (None, f1, f2)
Das erschafft viele Funktionen, also könnte man lambdas nehmen:

Code: Alles auswählen

execlist = (None, lambda: showRecipes(1), lambda: showRecipes(2)) 
oder, für die imho bessere Lesbarkeit, und weil es genau der Anwendungsbereich ist, partials

Code: Alles auswählen

from functool import partial

execlist = (None, partial(showRecipes, 1), partial(showRecipes, 2))

Verfasst: Donnerstag 3. Juli 2008, 17:36
von CM
Oder so:

Code: Alles auswählen

def foo1(): return 1
def foo2(): return 2
auswahl = {'key1': foo1(), 'key2': foo2()}
Wenn man dann

Code: Alles auswählen

auswahl['key1']
wählt, erhält man die Ausgabe von foo1()

Gruß,
Christian

Verfasst: Donnerstag 3. Juli 2008, 17:47
von EyDu
Da wäre

Code: Alles auswählen

def foo1(): return 1
def foo2(): return 2
auswahl = {'key1': foo1, 'key2': foo2}
mit

Code: Alles auswählen

auswahl['key1']()
etwas allgemeinert. Dann können die Funktionen auch Seiteneffekte haben.

Verfasst: Donnerstag 3. Juli 2008, 17:49
von CM
Merci - ich bin auf dem Auge irgendwie blind. Immer derselbe Fehler ... :oops: