Seite 1 von 1

Import und Variablen across Modulen

Verfasst: Dienstag 7. April 2020, 11:36
von lalelu169
Guten Morgen an alle
Ich schreibe ein Programm, welches aus den folgenden Modulen besteht

Code: Alles auswählen

#config.py
def init():
	global myList
	myList = [ ]
config wird benutzt um Konstanten für alle Module (z.B., Spielfeldgrössen, Farben) zu definieren. Es dient aber auch dazu globale Variablen (z.B. Spielfeld, Zuglisten, Spielstände) zu initialisieren

Code: Alles auswählen

# modul01.py (Modul02 etc)
from config import *
def add_hey():
	myList.append("Hey")

Code: Alles auswählen

# main.py
from config import *
init()
import modul01
modul01.add_hey()
print(myList)
Fehlermeldung: name 'myList' is not defined.

Wenn ich main wie folgt schreibe funktioniert es

Code: Alles auswählen

# main02.py
import config
config02.init()
import modul01
modul01.add_hey()
print(config.myList)
Wieso funktioniert die Methode mit * hier nicht? Die Variablen in jeden Funktionsaufruf zu packen, ist in meiner Situation schwierig, da die Parameteranzahl pro Funktion dann recht hoch sein dürfte. Alles in einem Modul zu lassen bringt nicht mehr lesbaren/pflegbaren Code.

Vielen Dank für ein paar Ideen...
...und bleibt in diesen Tagen gesund
VG

Re: Import und Variablen across Modulen

Verfasst: Dienstag 7. April 2020, 11:57
von Sirius3
@lalelu169: nur weil Du alle Namen importierst, heißt das noch nicht, dass Du auch die beiden Namensräume verschmelzt.

Module sollten für sich stehen, benutze keine globalen Variablen, und keine my-Präfixe. Und schon hast Du einige Probleme weniger.

Re: Import und Variablen across Modulen

Verfasst: Dienstag 7. April 2020, 11:59
von __deets__
Um solche Probleme zu loesen benutzt man ueblicherweise objektorientierte Programmierung. Und doch, man gibt die notwendigen Informationen explizit weiter. Globaler Zustand ist nunmal seit inzwischen einem guten halben Jahrhundert als schlecht fuer die Verstaendlichkeit und Wartbarkeit von Software klar ausgemacht, und sollte darum vermieden werden.

Globale Variablen in dem Sinne gibt es in Python auch nicht (so richtig, es gibt dreckige Tricks). "global" sollte eigentlich "module-global" heissen. Man muss sie also tatsaechlich so ansprechen wie du, wenn man sie aendern will. Denn sonst importiert man sie in den *eigenen* Namensraum, und wenn diese Bindung sich aendert, aendern sich andere Namensraeume nicht. Ausnahme sind natuerlich veraenderliche Objekte.

Aber nochmal: nein, so macht man das nicht. Explizite Argumente sind immer die bessere Wahl, ausser bei Dingen die Konstanten sind.