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
Funktionsname in Variable speichern und wieder aufrufen
Code: Alles auswählen
def a(): return 42
b = a
b()
Hallo Stefan.
Wie ich den Inhalt einer Var speichere krieg ich auch noch hin.
Lies bitte meine Frage nochmal richtig !
Ich muß den NAMEN einer Funktion speichern!
Wie ich den Inhalt einer Var speichere krieg ich auch noch hin.
sma hat geschrieben:StefanCode: Alles auswählen
def a(): return 42 b = a b()
Lies bitte meine Frage nochmal richtig !
Ich muß den NAMEN einer Funktion speichern!
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
Code: Alles auswählen
b = a.func_name
Code: Alles auswählen
funcs = { a.func_name: a }
print funcs["a"]()
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
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
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.
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.
Das Leben ist wie ein Tennisball.
Z.B. so: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
Code: Alles auswählen
def tolle_funktion(s):
print "Hipp, Hipp,", s
func_name = tolle_funktion.func_name
# Aufruf dann...
eval(func_name)("Hurra!")
@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.
@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.
Habe nur etwas herumgespielt:
yipyip
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
@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.
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.
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.
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.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Und warum willst du das ueber den Funktionsnamen loesen? Ein Dictionary, das die Zeitpunkte den Funktionen loest das doch besser?
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Versteh ich so nicht.
Ob Liste oder Dictionary ändert nichts an der Tatsache die Funktionsnamen für einen Aufruf zu speichern.
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?
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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.
Das ist im uebrigen das, was sowohl sma, als auch yipyip gezeigt haben.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Würdest Du mich bitte kurz über den Unterschied zwischen Funktionsname und Funktionsobjekt erläutern ?
Ich ahne da was.
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.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ein Name ist an ein Modul gebunden, das Objekt nicht - wäre jetzt mal meine Schnell-Erklärungmikehydro hat geschrieben:Würdest Du mich bitte kurz über den Unterschied zwischen Funktionsname und Funktionsobjekt erläutern ?
Ich ahne da was.
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.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.
Code: Alles auswählen
def foo():
pass
def bar():
pass
mapping = {
1000: foo,
1001: bar,
1004: bar
...
}
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.
Der Key ist hier eben der Zeitpunkt, als value nimmst Du das Objekt.[/quote]
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
...
}
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Dann solltest du spaetestens jetzt das Tutorial lesen.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Sorry.cofi hat geschrieben:Dann solltest du spaetestens jetzt das Tutorial lesen.
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.