UnboundLocalError ohne jeden Grund....

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
Klemens
User
Beiträge: 8
Registriert: Mittwoch 25. Juli 2007, 10:58

Donnerstag 18. Oktober 2007, 08:39

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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Donnerstag 18. Oktober 2007, 08:48

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.
TUFKAB – the user formerly known as blackbird
Klemens
User
Beiträge: 8
Registriert: Mittwoch 25. Juli 2007, 10:58

Donnerstag 18. Oktober 2007, 08:51

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
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Donnerstag 18. Oktober 2007, 08:53

Ö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...
Klemens
User
Beiträge: 8
Registriert: Mittwoch 25. Juli 2007, 10:58

Donnerstag 18. Oktober 2007, 08:57

ja, das könnte ich, da es sich jedoch um eine Konvertierung einer proprietären Scriptsprache zu Python Code handelt, ist es so einfacher...
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Donnerstag 18. Oktober 2007, 10:30

Wie schon geschrieben, musst du noch ein "global test,bew" an den Anfang der Funktion stellen.

Übrigens brauchst du if-Bedingungen nicht zu klammern.
Klemens
User
Beiträge: 8
Registriert: Mittwoch 25. Juli 2007, 10:58

Donnerstag 18. Oktober 2007, 11:10

Danke für die Antworten!
Ich werde jetzt "global" davor schreiben.
Aber wieso funktioniert die Variable "test" aber "bew" nicht?
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Donnerstag 18. Oktober 2007, 11:19

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...
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Donnerstag 18. Oktober 2007, 12:35

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.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Donnerstag 18. Oktober 2007, 12:41

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.
Klemens
User
Beiträge: 8
Registriert: Mittwoch 25. Juli 2007, 10:58

Donnerstag 18. Oktober 2007, 13:02

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
Antworten