Seite 1 von 1
Selbstreferenz im Hauptprogramm
Verfasst: Sonntag 6. April 2014, 18:45
von Bachsau
Hallo,
gibt es eine Möglichkeit auf die Funktionen des Hauptprogramms wie mit "self" innerhalb eines Objekts zu verweisen? Ich experimentiere gerade mit GtkBuilder, wo sich per XML definierte Handler über connect_signals(object) mit Funktionen verbinden lassen. Erwartet wird ein Objekt, dessen Methoden den in XML definierten Bezeichnern entsprechen, oder ein Dictionary, dass die Bezeichner den Funktionen zuordnet. Ich würde gern etwas übergeben, dass es mir ermöglicht, alle Funktionen direkt aufzurufen.
Gruß,
Bachsau
Re: Selbstreferenz im Hauptprogramm
Verfasst: Sonntag 6. April 2014, 18:56
von Balmung
Du meinst das an connect_signals(obj) übergebene objekt soll eine Referenz zu dem "__main__" Programm sein, welches Funktionen auf modul-ebene definiert hat?
Du könntest __main__ importieren und dieses dann an connect_signals übergeben, oder wenn es mit dictionaries auch geht, könntest du auch globals() überegebn.
Re: Selbstreferenz im Hauptprogramm
Verfasst: Sonntag 6. April 2014, 19:45
von Bachsau
Danke. Also das mit den globals() funktioniert schonmal.

Allerdings ist das nur ein Schnappschuss zum Zeitpunkt des Aufrufs. Ich überlege gerade, ob es möglich ist, eine Methode zu erzeugen, die aufgerufen wird, wenn keine passende Methode definiert ist... Bin fortgeschrittener PHP-Depp, aber ganz neu bei Python, und da ist so etwas möglich.
Das importieren von __main__ hab ich leider nicht ganz verstanden. Wird das nicht dazu führen, dass das ganze Programm noch einmal ausgeführt wird?
Re: Selbstreferenz im Hauptprogramm
Verfasst: Sonntag 6. April 2014, 19:53
von BlackJack
@Bachsau: Eine Methode die aufgerufen wird wenn ein Attribut abgefragt wird das es nicht gibt, kann man auch in Python schreiben. Ich frage mich allerdings was das in diesem Fall bringen soll. Zu dem Zeitpunkt wo Du `connect_signals()` aufrufst, müssen die Funktionen alle schon bekannt sein, denn damit kann man ja nichts verbinden was es nicht gibt. Also müsste das zu dem Zeitpunkt auch schon alles in `globals()` stehen.
Code auf Modulebene wird nur ein einziges mal ausgeführt, egal wie oft man ein Modul importiert. Und auch hier sollte man das genau wie bei `globals()` für Deinen Fall erst machen wenn die ganzen Definitionen schon ausgeführt wurden.
Üblicherweise steht das Hauptprogramm in einer `main()`-Funktion, die von folgendem Idiom am Ende des Moduls aufgerufen wird:
Re: Selbstreferenz im Hauptprogramm
Verfasst: Sonntag 6. April 2014, 20:44
von Bachsau
BlackJack hat geschrieben:Zu dem Zeitpunkt wo Du `connect_signals()` aufrufst, müssen die Funktionen alle schon bekannt sein, denn damit kann man ja nichts verbinden was es nicht gibt.
Das stimmt. Man müsste alles mit einer Ersatzmethode verbinden, die später die eigentliche Funktion aufruft, und alle Daten übergibt. Zugegebenermaßen totaler Quatsch, weil man Funktionen vor Programmstart definiert. Aber zumindest als Proof of Concept schon interessant.
BlackJack hat geschrieben:Code auf Modulebene wird nur ein einziges mal ausgeführt, egal wie oft man ein Modul importiert.
Das hab ich schon raus ja. Ich dachte nur, dass man __main__ vielleicht zumindest einmal als Modul importieren kann, und wenn nein, hätte ich nicht erwartet, dass die Klassen trotzdem in die aktuelle Symboltabelle importiert werden.
BlackJack hat geschrieben:Üblicherweise steht das Hauptprogramm in einer `main()`-Funktion, die von folgendem Idiom am Ende des Moduls aufgerufen wird:
Ist das so, ja? Ich nehme an, es gibt praktische Gründe, nach diesem Paradigma zu programmieren?

Re: Selbstreferenz im Hauptprogramm
Verfasst: Sonntag 6. April 2014, 20:57
von BlackJack
@Bachsau: Zum ``if __name__ …``: Damit kann man das Modul ohne Nebeneffekte importieren, also insbesondere ohne dass der Code in diesem ``if``-Zweig ausgeführt wird. Zum Beispiel um das Modul wiederzuverwenden, oder um es in einer Python-Shell zu importieren und „live” Sachen auszuprobieren, und für Unit-Tests, und Werkzeuge die Module inspizieren, und Dokumentationssysteme, …
Re: Selbstreferenz im Hauptprogramm
Verfasst: Sonntag 6. April 2014, 21:52
von Bachsau
Alles klar. Ich dachte, es hätte vielleicht noch einen anderen Grund. Danke für die Infos.
