Import und Variablen across Modulen

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
lalelu169
User
Beiträge: 12
Registriert: Dienstag 7. April 2020, 10:56

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
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten