Kleines Problem mit global und Gültigkeitsbereich.

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
root_tux_linux
User
Beiträge: 36
Registriert: Sonntag 16. Dezember 2007, 04:18

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.
AMD Athlon 64 X2 6000+, ASUS M2N-SLI Deluxe, ASUS EN8600GTS Silent, 4GB Apacer DDR2 800Mhz | Gentoo Linux x86_64
AMD Sempron 2500+, MSI KT4, ASUS N6200, 2x 512MB Apacher DDR 400Mhz, Hauppauge PVR150 | Arch Linux i686
### Sorry for my bad english ###
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Gegenfrage: Warum brauchst du global? Siehe: [wiki]Die global-Anweisung[/wiki]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

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.
root_tux_linux
User
Beiträge: 36
Registriert: Sonntag 16. Dezember 2007, 04:18

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? ^^
AMD Athlon 64 X2 6000+, ASUS M2N-SLI Deluxe, ASUS EN8600GTS Silent, 4GB Apacer DDR2 800Mhz | Gentoo Linux x86_64
AMD Sempron 2500+, MSI KT4, ASUS N6200, 2x 512MB Apacher DDR 400Mhz, Hauppauge PVR150 | Arch Linux i686
### Sorry for my bad english ###
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Nicht wirklich, ohne dass du mir mehr Code zeigst.
### Sorry for my bad english ###
Nicht wirklich notwendig hier :)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten