dynamischer Methodenaufruf

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.
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

dynamischer Methodenaufruf

Beitragvon da.dom » Donnerstag 3. Juli 2008, 16:25

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
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Re: dynamischer Methodenaufruf

Beitragvon keppla » Donnerstag 3. Juli 2008, 16:37

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))
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Donnerstag 3. Juli 2008, 17:36

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
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Donnerstag 3. Juli 2008, 17:47

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Donnerstag 3. Juli 2008, 17:49

Merci - ich bin auf dem Auge irgendwie blind. Immer derselbe Fehler ... :oops:

Wer ist online?

Mitglieder in diesem Forum: Google [Bot], Sirius3