Seite 1 von 1

Kleines Problem mit global und Gültigkeitsbereich.

Verfasst: Freitag 7. März 2008, 07:23
von root_tux_linux
Hi

Ist noch früh am Morgen aber schon ein Problem ;)

Zwar will der Gültigkeitsbereich nicht so wie ich will.

Wenn ich ne Funktion oder Klasse schreibe ala:

Code: Alles auswählen

class Touch:
    def __init__(self):
        global x,y
        x = 'Hallo'
        y = 'Welt'
Und dann mit z = Touch() aufrufe hab ich am Ende ein x und y.

Code: Alles auswählen

>>> class Touch:
	def __init__(self):
		global x,y
		x = 'Hallo'
		y = 'Welt'
>>> z = Touch()
>>> x,y
('Hallo', 'Welt')
>>> 
x und y existierten vor dem aufrufen der Klasse nicht.

Wenn ich nun die genau gleiche Klasse importiere und ausführe bekomm ich eine Fehlermeldung aber diese erscheint nicht beim ausführen sondern erst wenn ich x oder y ausgeben will weil x,y angeblich nicht existieren.

Code: Alles auswählen

>>> from TEST import Touch
>>> z = Touch()
>>> x,y

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    x,y
NameError: name 'x' is not defined
>>> y

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    y
NameError: name 'y' is not defined
>>> 
Tja, jetzt frag ich mich wieso die exakt gleiche Klasse nach einem Import rumzickt und wenn man sie nicht importiert funktioniert.

Kann mir das jemand verraten?

Hab schon in meinem Python Ge-Packt, Einführung in Python und OpenBook - Python, A Byte Of Python geblättert ohne Antwort auf meine Frage.

Verfasst: Freitag 7. März 2008, 08:13
von jens
Gegenfrage: Warum brauchst du global? Siehe: [wiki]Die global-Anweisung[/wiki]

Verfasst: Freitag 7. März 2008, 09:09
von Zap
Ich müsste das ganze selber nochmal testen um 100%ig Sicher zu sein was da los ist aber ich gebe mal meine Vermutung zum besten ;)

Also, in python ist die global Anweisung immer nur auf ein Modul bezogen.
Wenn du ein from TEST import Touch machst, hast du lediglich Touch in deinem Sichtbereich nicht aber all die anderen Attribute die die das Modul TEST hat.
Ich könnte dir jetzt Wege verraten wie du da dran kommst, aber da das Design so unglaublich Fragwürdig ist und dir irgendwann später ganz schön weh tun wird, lasse ich das lieber ;)
Möchte mich dann lieber dem Vorschlag von jens anschließen, dass du am besten die ganze global Sache überdenkst und hoffentlich zum dem Entschluss kommst das du sie garnicht brauchst.

Verfasst: Freitag 7. März 2008, 22:42
von root_tux_linux
Thx.


Naja ich will ein Modul importieren das ProxyHandler, build und addheader auf opener anwendet und dann soll der restliche Code über diesen opener die URL aufrufen.


Da ich das ganze nicht in jedes Modul von Hand schmeissen will und im fall einer änderung 5 Dateien umschreiben, dachte ich ich schreib ne proxy.py und import dir diese und überschreibe den globale opener ohne das ich extra alles der funktion/klasse übergeben muss.

Versteht ihr was ich meine? ^^

Verfasst: Samstag 8. März 2008, 17:16
von birkenfeld
Nicht wirklich, ohne dass du mir mehr Code zeigst.
### Sorry for my bad english ###
Nicht wirklich notwendig hier :)