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

Sonntag 18. Oktober 2009, 11:27

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

Sonntag 18. Oktober 2009, 11:29

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

Sonntag 18. Oktober 2009, 11:31

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

Sonntag 18. Oktober 2009, 11:35

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

Sonntag 18. Oktober 2009, 12:02

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: 4878
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sonntag 18. Oktober 2009, 12:25

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: 208
Registriert: Mittwoch 4. Juli 2007, 20:40

Sonntag 18. Oktober 2009, 12:25

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

Sonntag 18. Oktober 2009, 13:02

@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

Sonntag 18. Oktober 2009, 13:21

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: 208
Registriert: Mittwoch 4. Juli 2007, 20:40

Sonntag 18. Oktober 2009, 16:39

@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

Sonntag 18. Oktober 2009, 17:00

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

Sonntag 18. Oktober 2009, 17:32

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

Sonntag 18. Oktober 2009, 17:43

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

Sonntag 18. Oktober 2009, 17:46

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

Sonntag 18. Oktober 2009, 17:50

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