Modul variablen zuweisen _bevor_ das Modul läuft

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.
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Modul variablen zuweisen _bevor_ das Modul läuft

Beitragvon henning » Freitag 28. Oktober 2005, 08:29

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
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Freitag 28. Oktober 2005, 11:42

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?
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Beitragvon henning » Freitag 28. Oktober 2005, 16:17

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)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 28. Oktober 2005, 20:20

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Samstag 29. Oktober 2005, 01:29

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.
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Beitragvon henning » Samstag 29. Oktober 2005, 10:36

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.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Samstag 29. Oktober 2005, 10:38

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???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Beitragvon henning » Samstag 29. Oktober 2005, 11:25

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 :-))

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]