Hallo, wenn ich den Namen ein Funktion, welche ich aufrufen möchte, in einem String habe, wie kann ich diese aufrufen? Geht bestimmt ganz simple, aber ich komme grad nicht drauf :-( def test(): print "Test" a= "test" Und nun irgendwie call a... Dazu müsste man aus dem String in a ein callable objekt machen. Mit freundlichen Grüßen Klaus Meyer :-) _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Hi! Wie wär's mit locals() oder globals(), welche dir ein Dictionary mit den lokal bzw. global definierten Symbolen zurückliefern.
def test(): print "Test"
a= "test"
Also konkret in deinem Fall sollte es globals()[a]() z.B. tun. Bye Oliver Klaus-G. Meyer wrote:
Hallo,
wenn ich den Namen ein Funktion, welche ich aufrufen möchte, in einem String habe, wie kann ich diese aufrufen? Geht bestimmt ganz simple, aber ich komme grad nicht drauf :-(
def test(): print "Test"
a= "test"
Und nun irgendwie call a... Dazu müsste man aus dem String in a ein callable objekt machen.
Mit freundlichen Grüßen Klaus Meyer :-)
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo Klaus, Klaus-G. Meyer wrote:
wenn ich den Namen ein Funktion, welche ich aufrufen möchte, in einem String habe, wie kann ich diese aufrufen? Geht bestimmt ganz simple, aber ich komme grad nicht drauf :-(
def test(): print "Test"
a= "test"
Und nun irgendwie call a... Dazu müsste man aus dem String in a ein callable objekt machen.
mir fällt im Moment auch keine bessere Idee ein als die von Oliver. Immer, wenn die Antwort auf eine Frage komplizierter aussieht, als ich dem Problem nach erwarten würde, trete ich gedanklich einen Schritt zurück und frage mich, ob ich das ursprüngliche Problem nicht anders angehen sollte. Entsprechend die Frage an dich: Wie bist du zu der obigen Frage gekommen; was ist das Problem, das zu diesem Ansatz geführt hat? Stefan _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Am 10/05/2003 12:54 PM schrieb Klaus-G. Meyer:
Hallo,
wenn ich den Namen ein Funktion, welche ich aufrufen möchte, in einem String habe, wie kann ich diese aufrufen? Geht bestimmt ganz simple, aber ich komme grad nicht drauf :-(
def test(): print "Test"
a= "test"
Und nun irgendwie call a... Dazu müsste man aus dem String in a ein callable objekt machen.
Kommt darauf an, in welchem Namensraum 'test' definiert ist. Wenn 'test' in einem Modul oder einer Klasse 'foo' definiert ist und a='test': getattr(foo, a)() Ebenso geht: eval('foo.%s()' % a) bzw. im globalen oder lokalen Namensraum: eval('%s()' % a) und natürlich die Lösung von Oliver Horn. Hdh, Chris _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo, ich Antworte mal hier, ein Danke geht natürlich an alle Antworter.
Wenn 'test' in einem Modul oder einer Klasse 'foo' definiert ist und a='test': getattr(foo, a)()
OK, getattr hatte ich in der Doku gefunden. Vermutlich werde ich es auch mit einer Klasse und dann mit getattr machen. Aber mir war nicht klar, wie ich das bei einfache Funktionen, deren Namen im String steht, machen konnte. Insgesamt überrascht es mich etwas, dass das in Python so "unintuitiv" geht. Alle Lösungen sehen für mich jedenfalls mehr oder weniger unschön aus. Bei meiner Suche in der Doku habe ich nach etwas ähnlichem wie zB int() oder str() gesucht, ich habe also eine Funktion gesucht, die mir aus dem String ein fct-object macht. Im Grunde macht der globals-Vorschlag das auch, aber es sticht nicht gerade ins Auge... (Könnte man natürlich noch in eine kleine hübsche Funktion verpacken :-) -- Mit freundlichen Grüßen Klaus Meyer :-) _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Klaus-G. Meyer wrote:
[...] Insgesamt überrascht es mich etwas, dass das in Python so "unintuitiv" geht. Alle Lösungen sehen für mich jedenfalls mehr oder weniger unschön aus. [...]
Das ist auch gut so [tm]. Unschöne und zu 99 % unnötige Hacks sollen nicht intuitiv sein, sonst hätten wir eine andere Programmiersprache :-D Meistens, wenn jemand so was will, ist in Wirklichkeit ein simpler Verweis auf eine Funktion angebracht. Minimales Beispiel: def f1(): print "f1" def f2(): print "f2" f = f1 f() f = f2 f() Der einzige Fall, wo ich mir momentan vorstellen könnte, dass es sinnvoll wäre, den Namen der zu verwendenden Funktion im String zu haben, ist wenn diese in einer Konfigurationsdatei festgelegt werden soll. -- Gerhard _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo Gerhard,
Das ist auch gut so [tm].
das ist eine der bewährten Ausreden ;-) Die anderen beliebten sind: Das haben wir schon immer so/anders gemacht! Das können wir aus Komatibilität nicht ändern!
Der einzige Fall, wo ich mir momentan vorstellen könnte, dass es sinnvoll wäre, den Namen der zu verwendenden Funktion im String zu haben, ist wenn diese in einer Konfigurationsdatei festgelegt werden
Naja, ein anderes nettes Beispiel: Man bekommt von außen Befehle (zB String-Befehle über eine Schnittstelle), auf die man reagieren/antworten soll. Was wäre simpler und einfacher, die Funktion, in der die Reaktion erfolgt, so zu nennen wie den Befehl, und dann direkt über den Befehlsstring die richtige Funktion aufzurufen? if fct(string): fct(string)() else: print "unbekannter Befehl" Das wäre schon alles (für eine simple Version, ohne weitere Fehlerbehandlung und weitere Randbedingungen). Ich finde das kurz und verständlich. -- Mit freundlichen Grüßen Klaus Meyer :-) _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo,
Naja, ein anderes nettes Beispiel: Man bekommt von außen Befehle (zB String-Befehle über eine Schnittstelle), auf die man reagieren/antworten soll.
Was wäre simpler und einfacher, die Funktion, in der die Reaktion erfolgt, so zu nennen wie den Befehl, und dann direkt über den Befehlsstring die richtige Funktion aufzurufen?
in realer, produktiver Software wirst du wohl kaum wollen, daß dein User beliebige Funktionen aus deiner Software aufrufen will. In dem Fall wirst du immer irgenwo eine Liste mit erlaubten Operationen pflegen müssen. Für dieses Problem würde ich immer einen Dict verwenden: ops = { 'operationA':someFktToExecuteA, 'operationB':someFktToExecuteB } und dann: try: ops[befehl](...) except KeyError: print "unbekannter Befehl"
Ich finde das kurz und verständlich.
Für ein einfaches Script ja, aber für produktiven Code nicht. Wie war das mit 'explizit ist besser als implizit'? Gruß, Achim _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
Hallo Achim,
immer irgenwo eine Liste mit erlaubten Operationen pflegen müssen. Für
sicher, deshalb hatte ich ja auch noch eine Anmerkung in Klammern geschrieben. Sorry wenn das nicht ausreichend war. -- Mit freundlichen Grüßen Klaus Meyer :-) _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (6)
-
Achim Domma (Procoders)
-
Christopher Arndt
-
Gerhard Häring
-
Klaus-G. Meyer
-
Oliver Horn
-
Stefan Schwarzer