Seite 1 von 1

UnboundLocalError ohne jeden Grund....

Verfasst: Donnerstag 18. Oktober 2007, 08:39
von Klemens
Hallo!

Ich hab ein kleine Python Script geschrieben, welches eine proprietäre Scriptsprache in Python Code umwandelt. Nun hab ich folgendes Problem:
Wenn ich folgendes Code Segment ausführe, bekomme ich die Fehlermeldung:
"UnboundLocalError: local variable 'bew' referenced before assignment".

Code: Alles auswählen

bew = 0
test = 0
def bewertung():
     print test, bew
     if (nummer == 100): 
          if (bew < 1):
               bew = 1
bewertung()
Die Variable "test" wird ausgegeben, aber bei "bew" klemmts...
Kann mir bitte jemand erklären wieso?

Vielen Dank
Klemens

Verfasst: Donnerstag 18. Oktober 2007, 08:48
von mitsuhiko
Weil du auf globale Variablen ohne das "global" Keyword nur lesen kannst. Jetzt machst du aber eine lokale Zuweisung und er regt sich auf, dass die lokale Variable bew noch nicht existiert.

Verfasst: Donnerstag 18. Oktober 2007, 08:51
von Klemens
Naja, aber die Fehlermeldung wird schon beim print Befehl ausgespuckt:
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Klemens\Desktop\test.py", line 10, in <module>
bewertung()
File "C:\Dokumente und Einstellungen\Klemens\Desktop\test.py", line 4, in bewertung
print test,bew
UnboundLocalError: local variable 'bew' referenced before assignment

Verfasst: Donnerstag 18. Oktober 2007, 08:53
von BlackVivi
Öhm, was möchtest du überhaupt machen oO?... Aber es sieht so aus, als möchtest du mit Hilfe einer Funktion eine Variable verwerten möchtest. Du könntest einfach test als Argument an die Funktion übergeben...

Verfasst: Donnerstag 18. Oktober 2007, 08:57
von Klemens
ja, das könnte ich, da es sich jedoch um eine Konvertierung einer proprietären Scriptsprache zu Python Code handelt, ist es so einfacher...

Verfasst: Donnerstag 18. Oktober 2007, 10:30
von Joghurt
Wie schon geschrieben, musst du noch ein "global test,bew" an den Anfang der Funktion stellen.

Übrigens brauchst du if-Bedingungen nicht zu klammern.

Verfasst: Donnerstag 18. Oktober 2007, 11:10
von Klemens
Danke für die Antworten!
Ich werde jetzt "global" davor schreiben.
Aber wieso funktioniert die Variable "test" aber "bew" nicht?

Verfasst: Donnerstag 18. Oktober 2007, 11:19
von BlackVivi
Klemens hat geschrieben:Danke für die Antworten!
Ich werde jetzt "global" davor schreiben.
Aber wieso funktioniert die Variable "test" aber "bew" nicht?
Iiih, global. Du solltest nochmal deine gesamte Struktur durchdenken. Irgendwas passt nicht. Sag uns am besten nochmal genau, was du machen willst...

Verfasst: Donnerstag 18. Oktober 2007, 12:35
von Joghurt
Klemens hat geschrieben:Danke für die Antworten!
Ich werde jetzt "global" davor schreiben.
Aber wieso funktioniert die Variable "test" aber "bew" nicht?
Weil du auf test nur lesend zugreifst:
print test -> Es wird nach test im lokalen Namensraum gesucht und dort nicht gefunden. Deshalb wird in den überliegenden, in diesem Falle der globale, Namenraum gesucht und dort gefunden und ausgegeben.

Das selbe passiert mit "bew" beim print und Vergleich. Danach wird aber bew zugewiesen. Da "bew" noch nicht im lokalen Raum exisitert, wird eine lokale Variable namens "bew" angelegt. Python merkt nun aber, dass du "bew" schon vorher referenziert hast, und um zu verhindern, dass du mal die globale und danach dann die lokale Variable referenzierst, wird ein Fehler geworfern, um dich auf diesen Zustand (der garantiert nicht das ist, was du willst) hinzuweisen.

Verfasst: Donnerstag 18. Oktober 2007, 12:41
von Joghurt
Ich schließe mich übrigens auch BlackVivi an, sag uns am besten, warum du das überhaupt machen willst. Eine andere Sprache in Python zu übersetzen ist keine so tolle Idee.

Wenn die Sprache nicht allzu komplex ist, sollte es nicht viel aufwendiger sein, einfach einen Parser/Interpreter für diese Sprache in Python zu schreiben. Es gibt einige Parsergeneratoren für Python, mit denen es (mit Übung) recht einfach ist, eine kleine Sprache selbst zu implementieren.

Verfasst: Donnerstag 18. Oktober 2007, 13:02
von Klemens
Danke Joghurt für die ausführliche Erklärung!

Es ist eigentlich ganz eine einfache (proprietäre Sprache) welche einen proprietären Parser hat welcher nur unter Win leuft.

Aber du hast recht es ist schwachsinnig das in Python zu übersetzen. :roll:
Hast du ein paar beispiele für solche Parsergeneratoren?

Vielen Dank
Klemens

:EDIT:

sufu benützt und was gefunden: http://www.python-forum.de/topic-5943.h ... rgenerator :o