Globale Variablen und Import

21/03/2008 - 20:31 von Wolfgang Fellger | Report spam
Ich brüte gerade über folgendes Verhalten:

Gegeben sei ein Modul myglobals mit einer globalen Variable header.
In dieser wird eine Instanz einer Klasse gespeichert.

Nun möchte ich von anderswo darauf zugreifen. Wenn ich aber im Modul

from myglobals import header

verwende, bindet das nur den /ursprünglichen/ Wert der Variable (also None).

So wie ich das sehe habe ich folgende Möglichkeiten:
a) nur "import myglobals" und überall qualifizieren. Blàht den Code aber
IMHO unnötig auf.
b) in allen Funktionen die es brauchen "from myglobals import header"
benutzen. Leider sind das praktisch alle in diesem Modul.
c) in myglobals direkt eine Dummy-Instanz zuweisen und die eigentliche
Initialisierung von __init__ in eine Methode verschieben.

Keine gefàllt mir sonderlich, auch wenn ich c favorisiere.
Gibt's noch andere?

Wolfgang Fellger
 

Lesen sie die antworten

#1 Volker Grabsch
21/03/2008 - 22:14 | Warnen spam
Wolfgang Fellger schrieb:
Nun möchte ich von anderswo darauf zugreifen. Wenn ich aber im Modul

from myglobals import header

verwende, bindet das nur den /ursprünglichen/ Wert der Variable (also None).

So wie ich das sehe habe ich folgende Möglichkeiten:
a) nur "import myglobals" und überall qualifizieren. Blàht den Code aber
IMHO unnötig auf.



Klingt naheliegend und sauber. Wenn dich die Lànge stört, mach doch
folgendes:

import myglobals as g
...
machwas_mit(g.header)

b) in allen Funktionen die es brauchen "from myglobals import header"
benutzen. Leider sind das praktisch alle in diesem Modul.



Würde ich nicht machen.

c) in myglobals direkt eine Dummy-Instanz zuweisen und die eigentliche
Initialisierung von __init__ in eine Methode verschieben.



Gefàllt mir auch nicht.


Vielleicht noch eine Variante d): Mach aus "header" eine Funktion:

(Modul myglobals)

_header = None

def header():
return _header

def set_header(header):
_header = header

Benutzt wird es via:

from myglobals import header
...
machwas_mit(header())

Ich würde dennoch a) bevorzugen. Das kommt ohne Boilerplate-Code aus,
und "g.header" ist genauso lang wie "header()".


Gruß,

Volker

"Wenn du der Meinung bist, der andere sei ein Depp, dann überlass das
Antworten denjenigen, die nicht dieser Meinung sind."

Ähnliche fragen