Seite 1 von 1
Globale Variable als Übergabeparameter
Verfasst: Montag 24. Februar 2020, 10:40
von Dewma
Hallo Zusammen,
ich möchte im Rahmen eines umfangreicheren Skriptes eine Hilfsfunktion zur Fehlerprüfung einbauen, die den Fehlernamen in die entsprechende globale Liste einfügt.
Dazu habe ich hier beispielhaft eine Methode geschrieben, welche die globale Liste erweitern soll. Der Name der globalen Liste soll dabei variabel bleiben und als Parameter bei Funktionsaufruf übergeben werden.
Leider kann ich auf diesem Wege nicht auf die globale Liste zugreifen. Gibt es einen Weg, den ich übersehen habe, um globale Variablen u. Objekte in Funktionen zu übergeben?
Code: Alles auswählen
list1=[]
def tmp(name, testList):
try:
global testList
testList.append(name)
return true
except:
return false
def main():
if tmp("Bier", list1):
print("Mach voll")
Bin für jede Hilfe dankbar!
Viele Grüße
Re: Globale Variable als Übergabeparameter
Verfasst: Montag 24. Februar 2020, 11:13
von einfachTobi
Globale Variablen muss man nicht übergeben. Sie sind - der Name verrät es - global. Allerdings solltest du keine globalen Variablen verwenden. Übergib deiner Funktion alles was sie benötigt und lass sie alle zurückgeben, was jemand anderes von ihr braucht. Eine Funktion kann mehrere Rückgabewerte besitzen.
Re: Globale Variable als Übergabeparameter
Verfasst: Montag 24. Februar 2020, 11:16
von Dewma
einfachTobi hat geschrieben: Montag 24. Februar 2020, 11:13
Globale Variablen muss man nicht übergeben. Sie sind - der Name verrät es - global.
Ja, ich möchte jedoch erst bei Funktionsaufruf entscheiden auf welche globale Variable ich zugreifen will - oder gibt es keine Möglichkeit das so zu implementieren?
Leider kann ich auf die Nutzung von globalen Variablen in diesem Fall nicht verzichten.

Re: Globale Variable als Übergabeparameter
Verfasst: Montag 24. Februar 2020, 11:31
von __deets__
Niemand hindert dich daran, eine globale Variable auch als Parameter zu uebergeben.
Code: Alles auswählen
foo = [1, 2, 3]
def test(some_list);
print(some_list)
test(foo)
Re: Globale Variable als Übergabeparameter
Verfasst: Montag 24. Februar 2020, 11:35
von einfachTobi
Mir ist kein einziger Fall bekannt, in dem man globale Variablen verwenden muss. Wenn du der Überzeugung bist, dass du das musst, dann liegt vermutlich ein struktureller Fehler vor.
Wenn du detaillierter beschreibst, was du eigentlich vor hast und ggf. den Code dazu postest, können wir dir sicher weiterhelfen.
Bei Funktionsaufruf übergibst du doch die entsprechende lokale Variable an die Funktion. Du entscheidest also dann, welche Variable verwendet werden soll. Warum muss die dazu global sein?
Re: Globale Variable als Übergabeparameter
Verfasst: Montag 24. Februar 2020, 11:37
von Sirius3
@Dewma: kannst Du genauer beschreiben, was Du machen willst? Mit den dürftigen Informationen können wir keine sinnvolle Lösung geben.
Es hört sich für mich sehr komisch an, dass man der Funktion den Namen einer globale Variable übergeben kann.
Welche Art Fehlerprüfung soll das stattfinden? Warum muß dazu etwas in eine globale Liste eingetragen werden?
`tmp` ist ein äußerst äußerst schlechter Funktionsname und trägt überhaupt nicht dazu bei, dass wir Dein Problem verstehen können. Das selbe gilt für `list1`.
Nackte `except`s dürfen nicht in einem Programm vorkommen. Da hast du gar keine Möglichkeit, auf Fehler zu reagieren, die zum Teil auch Programmierfehler (wie hier) sein könnten. Immer nur die Fehler abfangen, die man auch sinnvoll verarbeiten kann. Außerdem kann in dem try-Block kein Fehler auftreten, der kein Programmierfehler ist.
Re: Globale Variable als Übergabeparameter
Verfasst: Montag 24. Februar 2020, 13:24
von __blackjack__
Beim gezeigten Code wird eine Ausnahme durch einen `True`/`False`-Rückgabewert ersetzt — genau um so etwas *nicht* zu machen wurden Ausnahmen erfunden. Nur falls das Argument sein sollte man könne das nicht über den Rückgabewert lösen weil die Funktion ja schon einen Wahrheitswert als Rückgabewert hat.
Re: Globale Variable als Übergabeparameter
Verfasst: Montag 24. Februar 2020, 14:49
von Dewma
__deets__ hat geschrieben: Montag 24. Februar 2020, 11:31
Niemand hindert dich daran, eine globale Variable auch als Parameter zu uebergeben.
Code: Alles auswählen
foo = [1, 2, 3]
def test(some_list);
print(some_list)
test(foo)
Da habe ich wohl zu kompliziert gedacht, Danke!
Mein Skript besteht aus einer GUI und mehreren Server-Abfragen, die als Threads globale Variablen füllen. Die Variablen werden dann ausgewertet und in die GUI aufgenommen.
Re: Globale Variable als Übergabeparameter
Verfasst: Montag 24. Februar 2020, 15:12
von Sirius3
@Dewma: dass __deets__ da eine "Lösung" gepostet hat, heißt nicht, dass Du das so benutzen sollst. Globale Variablen gehen gar nicht, und erst recht nicht im Zusammenhang mit Threads. Das scheint jetzt für Dich zwar zu funktionieren, es ist aber garantiert kaputt. Threads sind ein schwieriges Thema und das korrekt zu implementieren ist noch komplizierter. Das Problem mit Threads ist, dass die Ergebnisse nicht reproduzierbar sind. Du kannst beliebig lange testen, und es scheint keinen Fehler zu geben, aber irgendwann schreibst Du dann doch falsche Werte, und merkst es nicht.
Daher nochmal: VERGISS DASS ES GLOBAL GIBT UND BENUTZE MIT THREADS KEINE GLOBALEN VARIABLEN.
Beschreibe doch Dein Problem und wir finden eine Lösung.
Re: Globale Variable als Übergabeparameter
Verfasst: Dienstag 25. Februar 2020, 18:32
von Apollo6
True und False groß...