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.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ja, weil deine Problemstellung eigentlich schon lange gelöst ist und du entweder zu ignorant oder zu unfähig bist um das zu realisieren...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mikehydro hat geschrieben:Meine Frage ist, präzise formuliert.

Kann ja mal genau! lesen.
Es fehlt z.B. schon einmal das Fragezeichen... so viel zur Präzision ;-)

sma hat Dir daraufhin doch auch eine Lösung gepostet! Wo ist denn dann jetzt noch das Problem? Imho deutet Deine Antwort auf sma darauf hin, dass Du das Konzept von Dictionaries noch nicht verstanden hast.

Wie sich dann jedoch herausstellte willst Du Dir gar nicht den Namen merken, sondern das Objekt! (Auch wenn Du das nicht einsehen willst und es vielleicht in seiner Gänze nicht verstehst. Letzteres ist aber imho nicht einmal mehr nötig, wenn man einfach mal meine Snipptes in einer Shell ausprobiert hätte)
Den Code kann ich Dir gerne posten, Du würdest es nicht verstehen, weil Du so überzeugt von Dir bist und gar nicht richtig liest.
Wieso lese ich nicht richtig? Im evolutionären Fluss dieser Diskussion habe ich sehr genau gelesen und entsprechend die Lösung weiter voran getrieben!
Und von SPS brauche ich vorher nichts zu sagen.
Ich habe ein Teilproblem geschildert und eine Frage gestellt.
Aber mir dann unterstellt, dass ich mich damit ja nicht auskennen würde, es mir aber dennoch anmaßen würde...

Mal abgesehen von Deiner asozialen Art: Wir haben doch zwei unterschiedliche Ansätze zur Lösun gezeigt. Wobei der letzte wesentlich direkter ist, als der erste. Und das Problem hast Du auch erst im Verlauf des Threads geschildert - weswegen wir dann ja erst kapiert haben, was Du eigentlich vor hast und dass ein Mapping die optimale Lösung ist.
In den C-Foren klappt das besser. Ohne Überheblichkeit.
Der einzige, der sich hier überheblich zeigt, bist Du!
Das haben jetzt auch alle kapiert. Oder ?
Naja, es haben wohl alle kapiert, dass es keinen Sinn hat, hier mehr etwas zu antworten oder Dir sonst wie zu helfen. Du gehst ja seit zig Antworten konsequent nicht auf meine Nach-Fragen oder Snipptes ein. Zudem schlägst Du einen aggressiven und fast schon beleidigenden Ton an und verkehrst in einer dreisten Art und Weise dazu noch diese Tatsache ins Gegenteil, indem Du anderen dieses unterstellst.

Ich denke das haben jetzt alle kapiert ;-)

Viel Spaß im C-Forum für Sozial-Legasteniker... auch wenn mich ein Link zu selbign schon mal interessieren würde :-D
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

mikehydro hat geschrieben:Meine Frage ist, präzise formuliert.

Kann ja mal genau! lesen.

Den Code kann ich Dir gerne posten, Du würdest es nicht verstehen, weil Du so überzeugt von Dir bist und gar nicht richtig liest.
Du bist es, der nicht richtig liest. Alles, was dir bisher geantwortet wurde, ist geeignet, dein Problem zu lösen, insbesondere alles, in dem das Wort "dict" vorkommt. Python dicts ("Mappings") sind ein elementares Werkzeug der Python-Programmierung, und wenn du das nicht mal ansatzweise lernen willst, solltest du wirklich lieber C programmieren. Im übrigen konnte ich nicht feststellen, dass hier jemand "von oben herab" geschrieben hätte. Es wurde nur der allgemeinen Ratlosigkiet Ausdruck verliehen, die deine Gegenantworten ausgelöst haben.
Und von SPS brauche ich vorher nichts zu sagen.
Ich habe ein Teilproblem geschildert und eine Frage gestellt.
Was du nicht zu verstehen scheinst, ist, dass dein Lösungsweg vielleicht der falsche ist, oder es zumindest in Python kürzere, einfachere und elegantere Wege gibt, das zu erreichen, was du erreichen willst (wie wärs hiermit?). Dein Teilproblem wäre dann nämlich dadurch gelöst, dass es verschwindet. Python != C, und eine Lösung, die in C gut ist, braucht deswegen nicht auch in Python gut sein. Bei der Python-Programmierung stellen sich einfach ganz andere Fragen bzgl des Designs, aber wenn du dich lieber mit null-terminierten Strings, eigenem Memory-Managment und verwaisten Pointern herumschlagen willst, bitte schön.
In den C-Foren klappt das besser. Ohne Überheblichkeit.

Danke.


Das haben jetzt auch alle kapiert. Oder ?
Allerdings. EOD.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Dies hier könnte auch bei der Genesung helfen.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

pillmuncher hat geschrieben:Python != C, und eine Lösung, die in C gut ist, braucht deswegen nicht auch in Python gut sein.
Wobei man sich doch auch in C einen Zeiger auf die Funktion merken würde, oder nicht? Speziell bei diesem Problem sehe ich da sogar durchaus Ähnlichkeiten zu C.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Hyperion hat geschrieben:
pillmuncher hat geschrieben:Python != C, und eine Lösung, die in C gut ist, braucht deswegen nicht auch in Python gut sein.
Wobei man sich doch auch in C einen Zeiger auf die Funktion merken würde, oder nicht? Speziell bei diesem Problem sehe ich da sogar durchaus Ähnlichkeiten zu C.
Schon. Und die Ähnlichkeiten gehen weiter, da man ja auch in C ein Mapping funcname --> function bräuchte. Dem OP Viel Spaß beim selber bauen.

Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
mikehydro
User
Beiträge: 20
Registriert: Mittwoch 11. Juni 2008, 19:10
Wohnort: Wachtberg bei Bonn

bords0 hat geschrieben:@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.

Zum Abschluß nochmal danke an bords0.

Diese Antwort hat mich am besten weitergebracht.
Das was Du hier schreibst funktioniert prima.


Mike
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und was genau ist daran

Code: Alles auswählen

def tolle_funktion(s):
    print "Hipp, Hipp,", s

func_name = tolle_funktion.func_name

# Aufruf dann...

eval(func_name)("Hurra!")
besser / leichter verständlich als

Code: Alles auswählen

def tolle_funktion(s):
    print "Hipp, Hipp", s

func = tolle_funktion
func("Hurra!")
?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Hyperion hat geschrieben:Und was genau ist daran

Code: Alles auswählen

def tolle_funktion(s):
    print "Hipp, Hipp,", s

func_name = tolle_funktion.func_name

# Aufruf dann...

eval(func_name)("Hurra!")
besser / leichter verständlich als

Code: Alles auswählen

def tolle_funktion(s):
    print "Hipp, Hipp", s

func = tolle_funktion
func("Hurra!")
?
Ist doch klar: das erste entspricht der spec, das zweite nicht. (spec == "ich will aber meine strings haben!! ichwillichwillichwill!!!!)
In specifications, Murphy's Law supersedes Ohm's.
mikehydro
User
Beiträge: 20
Registriert: Mittwoch 11. Juni 2008, 19:10
Wohnort: Wachtberg bei Bonn

Danke Hyperion.

Nun hast Du zum Abschluß noch eine schöne Schlammschlacht geliefert.
Hat hoffentlich gut getan.

Ich bin jedenfalls nicht persönlich verbal beleidigend geworden.
Wo lernt man so was?

Nun weiß hier jeder über Dich Bescheid.
Du hast ein tolles Niveau.

Wir sind stolz auf Dich.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

kimx hat geschrieben:Jetzt gehts. Habe leider den Post mit der korrekten Methode nicht gesehen.
Sehr gutes Forum, danke nochmal

kimx
SCNR
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mikehydro hat geschrieben:Danke Hyperion.

Nun hast Du zum Abschluß noch eine schöne Schlammschlacht geliefert.
Hat hoffentlich gut getan.
Inwiefern?
Ich bin jedenfalls nicht persönlich verbal beleidigend geworden.
Das ist hier im Forum eigentlich ein Standard!
Wo lernt man so was?
Was denn? Ich kapiere den Bezug zum Satz davor nicht...
Nun weiß hier jeder über Dich Bescheid.
Inwiefern?
Du hast ein tolles Niveau.
Danke, ich bemühe mich stests. Jaja, ich weiß, das was Ironie von Dir. Ich nehme es aber mal als unironisches Kompliment auf :-)
Wir sind stolz auf Dich.
Pluralis majestatis?

Wieso eigentlich kannst Du nicht mal inhaltlich auf Dinge antworten, sondern flüchtest Dich permanent auf diese Meta-Ebene, sobald Du das gefühl hast, man würde Dich persönlich angreifen?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

mikehydro hat geschrieben:Danke Hyperion.

Nun hast Du zum Abschluß noch eine schöne Schlammschlacht geliefert.
Hat hoffentlich gut getan.

Ich bin jedenfalls nicht persönlich verbal beleidigend geworden.
Wo lernt man so was?

Nun weiß hier jeder über Dich Bescheid.
Du hast ein tolles Niveau.

Wir sind stolz auf Dich.
Hab ich irgendwelche Beiträge von Hyperion überlesen oder hat der TS Halluzinationen
:?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

pillmuncher hat geschrieben:
Hyperion hat geschrieben:
pillmuncher hat geschrieben:Python != C, und eine Lösung, die in C gut ist, braucht deswegen nicht auch in Python gut sein.
Wobei man sich doch auch in C einen Zeiger auf die Funktion merken würde, oder nicht? Speziell bei diesem Problem sehe ich da sogar durchaus Ähnlichkeiten zu C.
Schon. Und die Ähnlichkeiten gehen weiter, da man ja auch in C ein Mapping funcname --> function bräuchte. Dem OP Viel Spaß beim selber bauen.

Gruß,
Mick.
Ha, ich wußte doch ich hatte mal so etwas ausprobiert:
http://paste.pocoo.org/show/145708/

Ich finde die Zeilen 42-46 und dann der Aufruf in Zeile 53 zeigen doch sehr schön die Ähnlichkeit zu dicts in Python.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Hyperion hat geschrieben:Ha, ich wußte doch ich hatte mal so etwas ausprobiert:
http://paste.pocoo.org/show/145708/

Ich finde die Zeilen 42-46 und dann der Aufruf in Zeile 53 zeigen doch sehr schön die Ähnlichkeit zu dicts in Python.
Stimmt. Aber mal angenommen, eine Funktion heißt "Zeitscheibe"? (Tipp: Buchstaben zählen ;-) )

Code: Alles auswählen

struct funcmap {
    char name[10];
    void (*func)(void);
};
...
// define our mapping
    struct funcmap dispatch[CALLS] = {
        {"foo", foo},
        {"bar", bar},
        {"index", bar},
        {"Zeitscheibe", Zeitscheibe}
    };
Außerdem ist die Suche nach der passenden Funktion O(n) (naja, bei drei oder vieren...). Nicht, dass dein Code irgendwie schlecht wäre, man programmiert halt so in C. Aber die Verwendung eines Python-dicts ist im Vergleich dazu die flexiblere, einfachere und fehlertolerantere Lösung, insbesondere deswegen, weil man dict nicht erst selber programmieren muss.

Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

pillmuncher hat geschrieben: Stimmt. Aber mal angenommen, eine Funktion heißt "Zeitscheibe"? (Tipp: Buchstaben zählen ;-) )

Code: Alles auswählen

struct funcmap {
    char name[10];
    void (*func)(void);
};
...
// define our mapping
    struct funcmap dispatch[CALLS] = {
        {"foo", foo},
        {"bar", bar},
        {"index", bar},
        {"Zeitscheibe", Zeitscheibe}
    };
Gäbe aber zumindest beim Compilieren ein Warning ;-)
Müßte man also statt dem char-Array einen Zeiger auf ein solches nehmen und dann die Länge beim Anlegen dynamisch allocieren?
Außerdem ist die Suche nach der passenden Funktion O(n) (naja, bei drei oder vieren...). Nicht, dass dein Code irgendwie schlecht wäre, man programmiert halt so in C.
Stimmt! Da müßte man also irgend wie hashen, um die Zugriffszeit zu verbessern und näher an ein dict zu kommen. Ich sollte mir mal den C-Quellcode zum dict in Python angucken... vermutlich werde ich ihn wohl aber nicht durchschauen :-D
Aber die Verwendung eines Python-dicts ist im Vergleich dazu die flexiblere, einfachere und fehlertolerantere Lösung, insbesondere deswegen, weil man dict nicht erst selber programmieren muss.
Klar. Ich wollte ja nur mal zeigen, dass es in C nicht unbedingt anders läuft. Letzteres scheint der OP ja super zu verstehen; evtl. hilft es ihm ja auf die Sprünge.
lunar

@Hyperion: Du kannst auch GHashTable nutzen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

lunar hat geschrieben:@Hyperion: Du kannst auch GHashTable nutzen.
Danke für den Hinweis. Die Glib ist für C ja mittlerweile fast ein Muss. Werde mein Beispiel dahingehend mal anpassen :-)
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Hyperion hat geschrieben:
pillmuncher hat geschrieben: Stimmt. Aber mal angenommen, eine Funktion heißt "Zeitscheibe"? (Tipp: Buchstaben zählen ;-) )

Code: Alles auswählen

struct funcmap {
    char name[10];
    void (*func)(void);
};
Gäbe aber zumindest beim Compilieren ein Warning ;-)
Müßte man also statt dem char-Array einen Zeiger auf ein solches nehmen und dann die Länge beim Anlegen dynamisch allocieren?
Den Aufwand würde ich gar nicht treiben, sondern nur das char-Array vergrößern. Ist ja dein Code, und du weißt ja, wie lang deine Funktionsnamen sind. Vielleicht noch einen Kommentar daneben, damit man's nicht vergisst.
...nur mal zeigen, dass es in C nicht unbedingt anders läuft. Letzteres scheint der OP ja super zu verstehen; evtl. hilft es ihm ja auf die Sprünge.
Vielleicht wollte er auch nur zu erkennen geben, dass er eine "richtige" Programmiersprache kann, statt "bloß" eine "Scriptsprache". Aber wahrscheinlich nicht, denn man soll ja von den Menschen immer nur das beste denken...

Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
lunar

pillmuncher hat geschrieben:Den Aufwand würde ich gar nicht treiben, sondern nur das char-Array vergrößern. Ist ja dein Code, und du weißt ja, wie lang deine Funktionsnamen sind. Vielleicht noch einen Kommentar daneben, damit man's nicht vergisst.
Gemäß Murphys Law vergisst man es irgendwann aber doch, und den Fehler muss man dann erstmal finden.
Antworten