Seite 1 von 3
Funktionsname in Variable speichern und wieder aufrufen
Verfasst: Sonntag 18. Oktober 2009, 11:27
von mikehydro
Schönen Sonntag wünsche ich.
Hab hier was (für mich) echt kniffliges.
Wie wird in Python der Name einer Funktion so in einer Variablen abgelegt, das man die Funktion später wieder aus der Variablen aufrufen kann.
(Den Sinn und Zweck, warum ich diese Funktionalität brauche, würde hier den Rahmen sprengen. Ist eine Steuerungstechnische Anwendung zur Maschinensteuerung.)
Danke.
Bis später.
Mike
Verfasst: Sonntag 18. Oktober 2009, 11:29
von sma
Verfasst: Sonntag 18. Oktober 2009, 11:31
von mikehydro
Hallo Stefan.
Wie ich den Inhalt einer Var speichere krieg ich auch noch hin.
sma hat geschrieben:
Stefan
Lies bitte meine Frage nochmal richtig !
Ich muß den NAMEN einer Funktion speichern!
Verfasst: Sonntag 18. Oktober 2009, 11:35
von sma
Ach so.
Doch sie wieder zu finden ist da schon schwerer. Irgendwo musst du dir noch das Mapping merken - oder dich darauf verlassen, dass sie in einem bestimmten Modul global ist oder gar in `globals` zu finden ist
Stefan
Verfasst: Sonntag 18. Oktober 2009, 12:02
von mikehydro
Sorry.
Der zweite Codeteil ist mir noch zu komplex.
Ich habe den Namen der Funktion inzwischen in einer Variablen:
def Zeitscheibe():
global funcname
funcname = Zeitscheibe.func_name
print funcname
Ausgabe ist richtigerweise: "Zeitscheibe"
Den "Wiederaufruf" verstehe ich so noch nicht.
Mike
Verfasst: Sonntag 18. Oktober 2009, 12:25
von EyDu
Erstmal solltest du vergessen, dass es "global" gibt. Wenn du das verwendest, dann machst du etwas falsch. Benutze Parameter oder Rückgabewerte.
sma verwendet in dem zweiten Stück Code ein Dictionary. Wenn dir das nichts sagen sollte, dann lese doch bitte noch einmal das offizielle Python-Tutorial durch.
Verfasst: Sonntag 18. Oktober 2009, 12:25
von bords0
mikehydro hat geschrieben:Sorry.
Der zweite Codeteil ist mir noch zu komplex.
Ich habe den Namen der Funktion inzwischen in einer Variablen:
def Zeitscheibe():
global funcname
funcname = Zeitscheibe.func_name
print funcname
Ausgabe ist richtigerweise: "Zeitscheibe"
Den "Wiederaufruf" verstehe ich so noch nicht.
Mike
Z.B. so:
Code: Alles auswählen
def tolle_funktion(s):
print "Hipp, Hipp,", s
func_name = tolle_funktion.func_name
# Aufruf dann...
eval(func_name)("Hurra!")
Verfasst: Sonntag 18. Oktober 2009, 13:02
von BlackJack
@bords0: Muss das sein!? Man sollte Leuten, die die Alternativen nicht verstanden haben, keine "Lösung" mit `eval()` zeigen.
@mikehydro: Vergiss `eval()` genau wie ``global`` am besten schnell wieder. Für beides gibt es in ganz wenigen Ausnahmefällen sinnvolle Anwendungen, aber die sollte man dann auch gut begründen können.
Verfasst: Sonntag 18. Oktober 2009, 13:21
von yipyip
Habe nur etwas herumgespielt:
Code: Alles auswählen
class FuncBag(object):
def register(self, func):
self.__dict__.update({func.func_name : func})
def __call__(self, name, *args, **kwargs):
return getattr(self, name)(*args, **kwargs)
def f(a, b, c=1): return a, b, c
def g(b=1, c=2): return b, c
bag = FuncBag()
bag.register(f)
bag.register(g)
x = "f"
y = "g"
print bag(x, 1, 2, 3)
print bag(y, 2, 3)
print bag.f(1, 2, 3)
print bag.g(2, 3)
yipyip
Verfasst: Sonntag 18. Oktober 2009, 16:39
von bords0
@yipyip: Wenn du f neu bindest, wird das nicht in bag sichtbar, d.h. bag.f ist noch die alte Funktion f.
Ich hatte es so verstanden, dass beim Aufruf die jeweils gerade daran gebundene Funktion verwenden werden soll. Deshalb hatte ich "eval" vorgeschlagen, weil ein dict o.ä. nicht ausreicht. Wenn er die Namen unter Kontrolle hat, ist das auch nicht gefährlich.
Kann aber gut sein, dass der OP eigentlich was ganz anderes will.
Verfasst: Sonntag 18. Oktober 2009, 17:00
von yipyip
Ich muss zugeben, dass ich das eigentliche Problem auch nicht so recht verstanden habe; dachte nur, man kann sich mit meinem Beispiel der Problematik etwas annaehern.
Verfasst: Sonntag 18. Oktober 2009, 17:32
von mikehydro
Hallo an alle.
Danke für das rege Interesse.
Ich sehe im Moment noch nicht klar.
Aber ich möchte meine Frage noch einmal konkretisieren.
Ich muß programmgesteuert zu bestimmten Zeiten bestimmte Funktionen ausführen.
Also meine Idee, die entsprechenden Funktionen (die Funktionsnamen) zusammen mit den entsprechenden Zeitpunkten in einer Liste abzulegen.
Dann kann eine Schleife immer im richtigen Zeitpunkt die richtige Funktion aufrufen.
Beispiel:
Zeitpunkt Funktion
100000 Funktion_1
100005 Funktion_2
100006 Funktion_1
100011 Funktion_1
100012 Funktion_4
Zur Info: Der Zeitpunkt ist ein eigenes Zeitsystem in ms.
Verfasst: Sonntag 18. Oktober 2009, 17:43
von cofi
Und warum willst du das ueber den Funktionsnamen loesen? Ein Dictionary, das die Zeitpunkte den Funktionen loest das doch besser?
Verfasst: Sonntag 18. Oktober 2009, 17:46
von mikehydro
Versteh ich so nicht.
Ob Liste oder Dictionary ändert nichts an der Tatsache die Funktionsnamen für einen Aufruf zu speichern.
cofi hat geschrieben:Und warum willst du das ueber den Funktionsnamen loesen? Ein Dictionary, das die Zeitpunkte den Funktionen loest das doch besser?
Verfasst: Sonntag 18. Oktober 2009, 17:50
von cofi
Und warum willst du schon wieder den Funktionsamen statt dem Funktionsobjekt speichern?
Das ist im uebrigen das, was sowohl sma, als auch yipyip gezeigt haben.
Verfasst: Sonntag 18. Oktober 2009, 17:53
von mikehydro
Würdest Du mich bitte kurz über den Unterschied zwischen Funktionsname und Funktionsobjekt erläutern ?
Ich ahne da was.
cofi hat geschrieben:Und warum willst du schon wieder den Funktionsamen statt dem Funktionsobjekt speichern?
Das ist im uebrigen das, was sowohl sma, als auch yipyip gezeigt haben.

Verfasst: Sonntag 18. Oktober 2009, 18:00
von Hyperion
mikehydro hat geschrieben:Würdest Du mich bitte kurz über den Unterschied zwischen Funktionsname und Funktionsobjekt erläutern ?
Ich ahne da was.
Ein Name ist an ein Modul gebunden, das Objekt nicht - wäre jetzt mal meine Schnell-Erklärung
cofi hat geschrieben:Und warum willst du schon wieder den Funktionsamen statt dem Funktionsobjekt speichern?
Das ist im uebrigen das, was sowohl sma, als auch yipyip gezeigt haben.

cofi wollte Dir nur deutlich machen, dass für Dein Vorhaben der Name der Funktion vollkommen egal ist, sondern für Dich das Mapping Zeit -> Funktions-Objekt vollkommen ausreicht.
Code: Alles auswählen
def foo():
pass
def bar():
pass
mapping = {
1000: foo,
1001: bar,
1004: bar
...
}
Der Key ist hier eben der Zeitpunkt, als value nimmst Du das Objekt.
Verfasst: Sonntag 18. Oktober 2009, 18:08
von mikehydro
Mapping ist jetzt eine ganz neue Kiste für mich.
Es wird nicht klarer ...
Die Liste mit den Zeitpunkten und Funktionsnamen (oder Funktionsobjekten) wird permanent erweitert, aktualisiert und natürlich zum richtigen Zeitpunkt auch abgearbeitet und der Eintrag entfernt.
Code: Alles auswählen
def foo():
pass
def bar():
pass
mapping = {
1000: foo,
1001: bar,
1004: bar
...
}
Der Key ist hier eben der Zeitpunkt, als value nimmst Du das Objekt.[/quote]
Verfasst: Sonntag 18. Oktober 2009, 18:22
von cofi
Dann solltest du spaetestens jetzt das Tutorial lesen.
Verfasst: Sonntag 18. Oktober 2009, 18:27
von mikehydro
cofi hat geschrieben:Dann solltest du spaetestens jetzt das Tutorial lesen.
Sorry.
Das habe ich ausreichend und intensiv getan!
Und das bei allen Tutorials die sich finden lassen.
Ich habe eine konkrete Frage.
Es bringt mir gar nichts, wenn ich hier Vorschläge bekomme, die nicht meine Frage beantworten, sondern mir eine komplett andere Vorgehensweise nahe legen wollen. Und wenn ich diese Thematik dann nicht kenne, bedeutet dies nicht das ich nun endlich mal das Tutorial lesen sollte.
ES STEHT NICHT DRIN.
Und wer das nicht glaubt sollte meine Frage (ganz weit oben) genau lesen und mir zeigen wo ich das aus einen Tutorial raushole.
Ich habe das halbe Wochenende Tutorals gelesen.