Funktionsaufruf durch String

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.
Antworten
Pytoniac
User
Beiträge: 7
Registriert: Montag 13. August 2012, 09:53

Hallo,

ich habe mir in einer Funktion eine kleine if-else Abfrage gebaut, momentan sieht diese in etwa so aus:

Code: Alles auswählen

if task == 'foo':
    self.class.foo()
elif task == 'bar':
    self.class.bar()
...
Ist es moeglich, statt des nochmaligen schreibens des Funktionsnamens (in diesem fall foo oder bar) einfach die Variable task anzugeben (String)?

Gruesse
Pytoniac
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Das schreit nach Dispatching, eine relativ einfache Abstraktion von wiederkehrenden Strukturen.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das Tutorial hilft hier nur bedingt weiter, da man fuer dieses Problem eigentlich direkt ein Dictionary und kein alist-Equivalent benutzen will, dann sieht das ganze so aus:

Code: Alles auswählen

task_dispatch = {'foo' : self.class.foo,
                 'bar' : self.class.bar}[task]()
Oder, falls es wirklich alles Attribute von `self.class` sind:

Code: Alles auswählen

getattr(self.class, task)()
Wobei man bei letzterem Wirklich aufpassen sollte, ob es auch wirklich eine Funktion/Methode ist.
Antworten