Problem mit Sichtbarkeit einer Variable (global)

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
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Hi,

ok, ich weis, eigentlich sollte man keine globalen Variablen benutzen, bzw. weitestgehend vermeiden, aber momentan hab ich bei einem Projekt (noch) keine andere Möglichkeit und deshalb soll eine Lösung mit einer globalen Variable als Zwischenlösung dienen.
Hier nun das Problem:
Es gibt 2 Files.

test.py

Code: Alles auswählen

from temp import *

irgendeine_funktion()
print name
temp.py

Code: Alles auswählen

global name
def irgendeine_funktion():
    name = 100
Jo, also ihr seht schon. Ich hab in einer anderen Datei eine Funktion, welche mir eine Variable auf einen Wert setzt, und diese Variable möchte ich nun in meiner test.py Datei sehen...
Kann mir bitte jemand eine Lösung mit globaler Variable zeigen?

Gruß
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi,

Du musst "global name" in die Funktion schreiben, weil sonst ist "name" eh global. Dann musst du die Funktion auch aufrufen, weil sonst bringt dir das garnichts. "global name" sagt ja nur, das innerhalb einer Funktion die Variable "name" aus dem globalen Namensraum genommen werden soll bzw. in diesen geschrieben werden soll.

Gruß, jj
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Hi,

meinst Du so?

test.py

Code: Alles auswählen

from temp import *

irgendeine_funktion()
print name
temp.py

Code: Alles auswählen

def irgendeine_funktion():
    global name
    name = 100

Das hab ich schon versucht, hat auch nicht funktioniert !?
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Also bei mir gehts...was kommt denn für ne Fehlermeldung?
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Es kommt:

Traceback (most recent call last):
File "............\test.py", line 5, in?
print name
Name Error: name 'name' is not defined

:cry:
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Ich habe diesen Beitrag wegen eines nicht zumutbaren Sternchenimports wieder gelöscht. lg Gerold :-)
Zuletzt geändert von gerold am Dienstag 29. Mai 2007, 10:44, insgesamt 2-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

...neuerdings bin ich zu solchen Konstrukten gewechselt:

my_app.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

EIN_TEXT = "Ich bin der Text in einer Konstante."


class _Settings(object):
    
    def __init__(self):
        self.name = "<>"
    
    def change_name(self):
        self.name = "Servus"

app_settings = _Settings()


class _Db(object):
    pass

app_db = _Db()


def main():
    """Aufruf über die Kommandozeile"""
    
    # Irgendwelcher Code


if __name__ == "__main__":
    main()
my_app_gui.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import my_app

settings = my_app.app_settings

print my_app.EIN_TEXT
print settings.name
settings.change_name()
print settings.name

# Code für die GUI
Ich halte mir also **nicht mehr** die Einstellungen und sonstige globale Objekte in einem oder mehreren Modulen, die ich dann vom Hauptprogramm und vom GUI-Programm importiere.

Stattdessen halte ich die Einstellungen und sonstige Objekte (z.B. Datenbankverbindung) im Hauptprogramm. Dieses Hauptprogramm wird so gestaltet, dass es mit Kommandozeilenparametern aufrufbar ist um ein paar Dinge zu erledigen, für die es keine GUI braucht. Das GUI-Modul importiert nur mehr das Hauptprogramm und kann damit auf alle globalen Objekte zugreifen. So werden Einstellungen nur einmal ausgelesen...

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

blubber hat geschrieben:Kann mir bitte jemand eine Lösung mit globaler Variable zeigen?
Hallo blubber!

Die "böse Seite der Macht" -- verführerisch sie ist. Sie dich verführt mit schnellen Ergebnissen. ;-)

global_objects.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

ein_text = "Ich bin der Text in einer Konstante."

def change_text():
    global ein_text
    ein_text = "Servus"

def show_text():
    print ein_text
hallo.py:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import global_objects as go

print go.ein_text
go.change_text()
print go.ein_text

go.ein_text = "AAAAAAAAAA"
print go.ein_text
go.show_text()
Setze es sehr vorsichtig ein. ``global`` hat viele Nachteile und kann der Grund sein, warum du dein Programm nicht richtig testen kannst oder es aus einem (lange) nicht erkennbaren Grund nicht so funktioniert, wie du glaubst.
Wenn du ``global`` aber nur in einem eingegrenzten, kleinen Raum einsetzt, dann kann es nicht so viel Schaden anrichten. Achte aber darauf, dass das Modul in dem du ``global`` einsetzt nicht zu sehr wächst. Je größer es wird, desto undurchschaubarer wird die "Böse Seite der Macht". :P

mfg
Gerold
:-)

PS: Mensch, bin ich heute wieder witzig. :roll:
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Hallo gerold,

erstmal Danke für die ausführliche Antwort, allerdings bekomm ich das nun nicht auf meine "Struktur" hin angewendet. Diese sollte nämlich so bestehen bleiben, sprich, ohne Klasse, lediglich eine Funktion, welche irgendwelche Variablen setzt und diese benötige ich dann global :(

*edit*
Oh, muss erst noch Deinen letzten Beitrag lesen :)
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Ok, hab mir aus Deinen Möglichkeiten nun was funktionierendes zusammgengebastelt, vielen Dank nochmal !
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Zum oben gezeigten Beispiel: Es kann nicht funktionieren, wenn du mit "*" importierst, da "global" ein Objekt nicht über Modulgrenzen hinweg binden kann. Weiters hättest du dann auch keine Möglichkeit, vom anderen Modul aus, die Variable direkt zu ändern.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

Ja, das hab ich mit Hilfe Deines Beispiels nun auch gemerkt.
Deine letzte Lösung kann ich wie gesagt bei mir anwenden und funktioniert auch. Ich werde auch darauf achten, dass die globale Variable in einem so kleinen Raum wie möglich unterwegs ist und die dunkle Seite der Macht niemals zu viel Kraft erlangt :wink:
Danke nochmal.
Antworten