Globale Variable als Übergabeparameter

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
Dewma
User
Beiträge: 3
Registriert: Montag 24. Februar 2020, 10:24
Wohnort: Kharkiv

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
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

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.
Dewma
User
Beiträge: 3
Registriert: Montag 24. Februar 2020, 10:24
Wohnort: Kharkiv

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

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)
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

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

@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.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Dewma
User
Beiträge: 3
Registriert: Montag 24. Februar 2020, 10:24
Wohnort: Kharkiv

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

@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.
Apollo6
User
Beiträge: 1
Registriert: Dienstag 3. September 2019, 13:32

True und False groß...
Viele Grüße,
Apollo :D
Antworten