Seite 1 von 1

Modul variablen zuweisen _bevor_ das Modul läuft

Verfasst: Freitag 28. Oktober 2005, 08:29
von henning
Moin, ich denke, ich werde bei meiner web-geschichte jetzt auch dazu übergehen, alle Infos mit einem speziellen Objekt zu übergeben.
Nun hat sich aber dummerweise das Problem ergeben, dass ich dieses Objekt schon gerne zur Zeit der Modulinitialisierung hätte.
Vielleicht veranschaulicht ein bisschen Code das besser:

handler.py:

Code: Alles auswählen

modul = __import__("modulname") # Hier wird das Modul schon ausgeführt!
modul.meine_variable = "xxx" # Zu spät!
Mit den globals() bzw. locals() - Parametern kriege ich das gewollte auch nicht hin, laut doku sind die auch nur da, um den Kontext zu bestemmen. Was nun?

Henning

Verfasst: Freitag 28. Oktober 2005, 11:42
von Joghurt
Was spricht dagegen, dass der Teil, der beim Import automatisch ausgeführt wird, in eine "init_module" Funktion zu packen, der du die notwendigen Parameter übergibst?

Verfasst: Freitag 28. Oktober 2005, 16:17
von henning
Dagegen spricht, dass ich viele dieser Module habe und da möglichst wenig unnötige Schachtelungen reinbringen möchte.
Ich konnte das Problem aber mit einer Restrukturierung meines Programms noch ganz elegant lösen/umgehen (es würde jetzt viel zu weit führen, das im Detail zu erklären)

Verfasst: Freitag 28. Oktober 2005, 20:20
von Leonidas
henning hat geschrieben:Ich konnte das Problem aber mit einer Restrukturierung meines Programms noch ganz elegant lösen/umgehen (es würde jetzt viel zu weit führen, das im Detail zu erklären)
Das ist gut: go for it.

Verfasst: Samstag 29. Oktober 2005, 01:29
von BlackJack
Ein Argument gegen Code auf Modulebene: Der wird ausgeführt wenn man das Modul importiert. Man kann es also nicht importieren um die Funktionen zu testen, wenn diese auf Modulebene schon ausgeführt werden.

Verfasst: Samstag 29. Oktober 2005, 10:36
von henning
Die Sache ist die, dass ich an sich in dem Modul nur eine Klasse habe und von der wird dan vom importierenden Modul eine Instanz gebildet, also gabs ursprünglich auch keinen Modul-Ebene-Code.

Bloß inzwischen sieht es so aus, dass die Klasse ihrerseits wieder Klassen enthält, die eine andere Klasse als metaklasse haben.
Der Code der __init__-Funktion der Metaklasse wird ja damit schon zur Klassendefinitionszeit, also wenn das Modul geladen wird, ausgeführt.
Die Metaklasse braucht aber bestimmte Informationen.
Ich habs jetzt aber so lösen können, dass ich ihr diese Informationen erst später gebe, weil sie zum __init__-Zeitpunkt eigentlich noch gar nicht gebraucht wird.

Verfasst: Samstag 29. Oktober 2005, 10:38
von jens
henning hat geschrieben:Der Code der __init__-Funktion der Metaklasse wird ja damit schon zur Klassendefinitionszeit, also wenn das Modul geladen wird, ausgeführt.
Eigentlich nicht... Also beim import des Modules wird noch nicht die __init__ Funktion "ausgeführt", sondern erst wenn man von der Klasse eine instanz erstellt. Oder meintest du das so???

Verfasst: Samstag 29. Oktober 2005, 11:25
von henning
Ich rede von der __init__-Funktion der Meta-Klasse.
Diese wird, wie du schon sagst, ausgeführt, wenn man eine Instanz von ihr erstellt. Die Instanz einer Metaklasse ist eine Klasse und in meinem Fall ist das die Klasse im Modul.
(Zugegeben, ich hab auch ein bisschen gebraucht, dahinter zu steigen, wie das mit den Metaklassen funzt, aber man kann tole Sachen damit machen :-))