Funktionsname in Variable speichern und wieder aufrufen

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.
mikehydro
User
Beiträge: 20
Registriert: Mittwoch 11. Juni 2008, 19:10
Wohnort: Wachtberg bei Bonn

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Code: Alles auswählen

def a(): return 42
b = a
b()
Stefan
mikehydro
User
Beiträge: 20
Registriert: Mittwoch 11. Juni 2008, 19:10
Wohnort: Wachtberg bei Bonn

Hallo Stefan.

Wie ich den Inhalt einer Var speichere krieg ich auch noch hin.
sma hat geschrieben:

Code: Alles auswählen

def a(): return 42
b = a
b()
Stefan

Lies bitte meine Frage nochmal richtig !

Ich muß den NAMEN einer Funktion speichern!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ach so.

Code: Alles auswählen

b = a.func_name
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

Code: Alles auswählen

funcs = { a.func_name: a }
print funcs["a"]()
Stefan
mikehydro
User
Beiträge: 20
Registriert: Mittwoch 11. Juni 2008, 19:10
Wohnort: Wachtberg bei Bonn

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

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.
Das Leben ist wie ein Tennisball.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

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!")
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.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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)
:wink:
yipyip
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

@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.
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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.
mikehydro
User
Beiträge: 20
Registriert: Mittwoch 11. Juni 2008, 19:10
Wohnort: Wachtberg bei Bonn

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.
Benutzeravatar
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?
mikehydro
User
Beiträge: 20
Registriert: Mittwoch 11. Juni 2008, 19:10
Wohnort: Wachtberg bei Bonn

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?
Benutzeravatar
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.
mikehydro
User
Beiträge: 20
Registriert: Mittwoch 11. Juni 2008, 19:10
Wohnort: Wachtberg bei Bonn

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.
:?:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
mikehydro
User
Beiträge: 20
Registriert: Mittwoch 11. Juni 2008, 19:10
Wohnort: Wachtberg bei Bonn

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]
Benutzeravatar
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.
mikehydro
User
Beiträge: 20
Registriert: Mittwoch 11. Juni 2008, 19:10
Wohnort: Wachtberg bei Bonn

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.
Antworten