Modulübergreifende Globale Variablen und Klassenvariablen

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.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 10. Januar 2008, 11:51

Happy programmglobales Debugging. Das ist ja noch toller als modulglobales Debugging, weil die Werte von überall geändert werden können.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Tristan
User
Beiträge: 3
Registriert: Donnerstag 10. Januar 2008, 09:52

Donnerstag 10. Januar 2008, 12:28

Klar sollten von einer Software-Design Perspektive betrachtet möglichst keine oder nur sehr wenige Variablen global sein. In manchen Situationen erweisst es sich aber als extrem nützlich. So gibt es manchmal z.B. allgemeine Objekte die fast überall gebraucht werden und wo der Komfort an einer Stelle auf diese zugreifen zu können, gegenüber dem "Verkapselungs-Ideal" überwiegt.

Globale Variablen, spährlich verwendet, entsprechen vom Nutzen her in etwa dem "Singleton" design-pattern, das anders in Python nicht umzusetzen ist. Vorallem wenn solche globale Variablen nur zum lese-Zugriff verwendet werden, ist der Gebrauch in bestimmten Situationen durchaus berechtigt, denk ich.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Donnerstag 10. Januar 2008, 12:39

Ich kann mich Tristan nur anschließen. Ich habe eine solche Methode ebenfalls angewendet in welcher Initialisierte Werte Projektweit zur verfügung gestellt wurden.
Allein der Gedanke das über irgendwelche externen Files zu händeln missfällt mir.
Die einzige Gefahr die man dabei immer im Auge behalten muss, ist (wie Gerold schon sagte), dass man das Modul immer auf dem gleichen Wege importieren muss.

Mal ne andere Frage: Wenn man das über Dateien machen würde kann man es ja schlecht über Tempfiles machen, da die anderen Module ja nicht wissen wie diese heissen. Macht man es über feste Namen gibts verherende Konflikte wenn man zwei Instanzen einer Applikation hat.
Wie könnte man diese Probleme geschickt lösen?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 10. Januar 2008, 12:59

Hallo!

Ich möchte allgemein darauf hinweisen, dass dieser Thread noch aus dem Jahr 2006 stammt. Und sich inzwischen alle Beteiligten viel besser mit Python auskennen, als das vor zwei Jahren der Fall war.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Donnerstag 10. Januar 2008, 13:41

Ich möchte allgemein darauf hinweisen, dass dieser Thread noch aus dem Jahr 2006 stammt.
Danke für den Hinweis, das ist mir voll nicht aufgefallen.
Und ich steig auch noch mit in die Diskusion ein :oops:
Jan.O
User
Beiträge: 61
Registriert: Samstag 26. April 2008, 00:32

Montag 20. April 2009, 19:46

gerold hat geschrieben:Hallo!

Ich möchte allgemein darauf hinweisen, dass dieser Thread noch aus dem Jahr 2006 stammt. Und sich inzwischen alle Beteiligten viel besser mit Python auskennen, als das vor zwei Jahren der Fall war.

mfg
Gerold
:-)
Hi Gerold,

Wolltest du damit vor 1,25 Jahren sagen, dass diese Methode Variablen zu globalisieren nach der Python-Philosophie nicht verwerflich ist?

Ich habe nämlich gerade genau das selbe problem, welches in diesem Thread beschrieben wurde, mit einem Web Framework. Ich muss die threadgebundene DB-Verbindung in allen Klassen verwenden können, die teilweise auch in Module ausgelagert sind.
DasIch
User
Beiträge: 2465
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Montag 20. April 2009, 20:07

Das hat nichts mit Python zu tun. Dieses Design ist ein Alptraum. Eines der wichtigsten Dinge um sauberen Code zu erzeugen ist Seiteneffekte zu vermeiden und nicht noch zu forcieren.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 20. April 2009, 21:08

Jan.O hat geschrieben:Wolltest du damit vor 1,25 Jahren sagen, dass diese Methode Variablen zu globalisieren nach der Python-Philosophie nicht verwerflich ist?
Hallo Jan.O!

Ich weiß nicht, was du mich damit fragen möchtest. Aber das was ich damals sagen wollte ist, dass es bessere Möglichkeiten gibt, eine Variable "global" für alle in das Programm eingebundenen Module zu halten.

Da ich mich mit SQLAlchemy nicht auskenne, kann ich dir bei deinem Problem nicht helfen. Aber wenn du eine Variable global für alle Programmmodule halten willst, dann musst du diese Variable nur in ein Modul schreiben und dieses Modul in jedem anderen Modul importieren, in welchem du diese Variable brauchst.

globalvars.py:

Code: Alles auswählen

#!/usr/bin/env python
#coding: utf-8
# globalvars.py

global_value_a = 10
global_value_b = 20
module1.py:

Code: Alles auswählen

#!/usr/bin/env python
#coding: utf-8
# module1.py

import globalvars


def print_globalvars():
    print globalvars.global_value_a
    print globalvars.global_value_b
    globalvars.global_value_a = 11
    globalvars.global_value_b = 21
module2.py:

Code: Alles auswählen

#!/usr/bin/env python
#coding: utf-8
# module2.py

import globalvars


def print_globalvars():
    print globalvars.global_value_a
    print globalvars.global_value_b
    globalvars.global_value_a = 12
    globalvars.global_value_b = 22
myprogram.py:

Code: Alles auswählen

#!/usr/bin/env python
#coding: utf-8
# my_program.py

import globalvars
import module1
import module2


def main():
    module1.print_globalvars()
    module2.print_globalvars()

    print globalvars.global_value_a
    print globalvars.global_value_b


if __name__ == "__main__":
    main()
Das löst aber nicht dein Threading-Problem. Außerdem ist es ratsamer, alle benötigten Objekte beim Aufruf einer Funktion an diese zu übergeben -- und nicht irgendwoher von einem globalen Variablen-Modul zu holen.

Wenn ich von mehreren Threads aus Zugriff auf eine Datenbank brauche, dann bekommt jeder Thread eine eigene Connection. Fertig Aus! Und die Sache ist gegessen. Wie das bei SQLAlchemy läuft, weiß ich nicht.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten