static var

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.
Antworten
anonym44

Hallo Freunde,

ich bekomme es leider nicht hin eine statische Variable in einem Modul zu definieren.

Ich habe 4 Module:
1. main
2 .config
3. funk
4. lib(beinhaltet variable myvar=None)

main:

Code: Alles auswählen

from config import *

import funk

setvar(111) # Funktion aus config(bez. lib / from lib import *)

funk.show()
config

Code: Alles auswählen

from lib import *

lib

Code: Alles auswählen

myvar=None

def setvar(var):
	global myvar
	myvar=var

funk

Code: Alles auswählen

from config import *

print "myvar", myvar     #var ist None

import config
print "config.myvar", config.myvar     #funktioniert! myvar=111 ! Ich will diesen Umweg unbedingt vermeiden, nur wie?



main laed(from config import *) config und dann funk(funk laed(from config import *) ebenfalls config, wird natuerlich ignoriert weil ja schon geladen).

config impoertiert lib mit "from lib import *"

mein load ruft dann eine funktion auf die myvar einen Wert zuweist.

Das Problem ist in funk myvar = None ist.
Wenn ich zusaetzich mit "import config" importiere kann ich mit config.myvar allerdings auf den richtigen Wert zugreifen.

:K :K
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Amerika_befreie_uns: Python kennt Variablen, wie Du sie willst, nicht. In Python gibt es Namen in unterschiedlichen Namensräumen, die an Objekte gebunden sind. Wenn Du einen Namen per import aus einem anderen Namensraum importierst, wir einfach nur das Objekt an den selben Namen im neuen Namensraum gebunden. Ein nachträgliches Binden an ein neues Objekt im alten Namensraum hat keinen Einfluß auf das Objekt das an den selben Namen im anderen Namensraum gebunden ist.

Globale Namen neu zu binden ist (fast) immer eine schlechte Idee, weil sie zu unerwartetem Verhalten führen kann. Um es deutlich zu machen, dass Du da etwas kritisches machst und Namen im Namensraum config neu bindest, sollte immer config explizit angegeben werden. Dann brauchst Du auch keine setter-Funktion:

Code: Alles auswählen

import config

config.myvar = 43

print config.myvar
Das ist kein Umweg, sondern die einzige Möglichkeit, Dich immer daran zu erinnern, dass es sich um eine config-Variable handelt.

Vermeide *-importe, da Du nicht kontrollieren kannst, welche Namen in Deinem Namensraum neu gebunden werden.
anonym44

:( :( :(

ich habe das fuer mein Framework vor.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

es gibt sicher eine bessere Alternative, zu dem, was Du vorhast. Erklär mal, was Du willst, und nicht, wie Du denkst, dass Du das Problem lösen kannst.
anonym44

Sirius3 hat geschrieben:es gibt sicher eine bessere Alternative, zu dem, was Du vorhast. Erklär mal, was Du willst, und nicht, wie Du denkst, dass Du das Problem lösen kannst.
ich erweitere das web framework.
Um eine seite zu rendern importiere ich einfach "from web import *" und schreibe

render.site.index()
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Amerika_befreie_uns: was ist das „web framework“? Und wo ist das Problem, wenn Du nicht alles wild und unkontrolliert überall importierst?
Antworten