Seite 1 von 1

Problem mit Sichtbarkeit einer Variable (global)

Verfasst: Dienstag 29. Mai 2007, 09:41
von blubber
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ß

Verfasst: Dienstag 29. Mai 2007, 09:46
von schlangenbeschwörer
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

Verfasst: Dienstag 29. Mai 2007, 09:53
von blubber
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 !?

Verfasst: Dienstag 29. Mai 2007, 10:06
von schlangenbeschwörer
Also bei mir gehts...was kommt denn für ne Fehlermeldung?

Verfasst: Dienstag 29. Mai 2007, 10:10
von blubber
Es kommt:

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

:cry:

Verfasst: Dienstag 29. Mai 2007, 10:15
von gerold
Ich habe diesen Beitrag wegen eines nicht zumutbaren Sternchenimports wieder gelöscht. lg Gerold :-)

Verfasst: Dienstag 29. Mai 2007, 10:42
von gerold
...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
:-)

Re: Problem mit Sichtbarkeit einer Variable (global)

Verfasst: Dienstag 29. Mai 2007, 11:09
von gerold
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:

Verfasst: Dienstag 29. Mai 2007, 11:09
von blubber
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 :)

Verfasst: Dienstag 29. Mai 2007, 11:18
von blubber
Ok, hab mir aus Deinen Möglichkeiten nun was funktionierendes zusammgengebastelt, vielen Dank nochmal !

Verfasst: Dienstag 29. Mai 2007, 11:19
von gerold
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.

Verfasst: Dienstag 29. Mai 2007, 11:30
von blubber
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.