Seite 1 von 1
local variable 't1' referenced before assignment
Verfasst: Freitag 8. September 2006, 16:36
von cle1986
Code: Alles auswählen
def start(self,evt):
print "Checking your inputs of correctness..."
if self.checking() == true:
print "Starting simulation"
execfile(self.filet.GetValue())
else:
print "Please correct your inputs, there happen some mistakes."
def checking(self):
if str(self.starttime) in string.digits:
t1 = true
if str(self.endtime) in string.digits:
t2 = true
if str(self.stepmax) in string.digits:
t3 = true
if str(self.stepmin) in string.digits:
t4 = true
if str(self.filet) in string.letters:
t5 = true
if (t1==true)&(t2==true)&(t3==true)&(t4==true)&(t5==true):
return true
else:
return false
Jedes mal wenn die obrige Funktion aufgrufen wird, dann bekomme ich jedesmal diese Fehlermeldung:
Traceback (most recent call last):
File "Z:\Eclipse\Pysmig\src\main.py", line 74, in start
if self.checking() == true:
File "Z:\Eclipse\Pysmig\src\main.py", line 90, in checking
if (t1==true)&(t2==true)&(t3==true)&(t4==true)&(t5==true):
UnboundLocalError: local variable 't1' referenced before assignment
Allerdings verstehe ich nicht warum. Auch wenn die Variablen mit self. anglegt werden funkt das Script nicht.
Die Funktion soll überprüfung, ob die eingegebenen Daten Zahlen bzw. Text sind.[/code]
Verfasst: Freitag 8. September 2006, 17:29
von mitsuhiko
ui, ui, ui
- python kennt kein true/false sondern nur True und False
- zweitens müsstest du t1/t2/t3/t4/t5 mit False initialisieren
- drittens macht man keien Vergleiche mit True/False (schon gar nicht true/false)
- willst du and und kein &
Verfasst: Freitag 8. September 2006, 17:34
von Leonidas
Aus
Code: Alles auswählen
if (t1==true)&(t2==true)&(t3==true)&(t4==true)&(t5==true):
kann man auch einfach
machen. Wobei t1...t5 nicht so schön ist, da wäre eine Liste warscheinlich besser geeignet. Eigentlich kann man die ganze def checking neu schreiben, mit weniger ifs und mehr komplexen Datenstrukturen.
Verfasst: Freitag 8. September 2006, 17:56
von Rebecca
Code: Alles auswählen
def checking(self):
t1 = str(self.starttime) in string.digits
t2 = str(self.endtime) in string.digits
...
return (t1 and t2 and t3 and t4 and t5)
Die ganzen if-Abfragen kann man weglassen. Du machst naemlich eigentlich sowas ueberfluessiges wie
Und was genau willst du mit
str(self.starttime) in string.digits bezwecken? Das kann man bestimmt auch noch schoener machen.
Verfasst: Freitag 8. September 2006, 18:27
von Joghurt
blackbird hat geschrieben: drittens macht man keien Vergleiche mit True/False (schon gar nicht true/false)
Genau! Dafür nimmt man die is_true-Methode:
Code: Alles auswählen
def is_true(statement):
if statement == True:
return True
else:
return False
if is_true(6>4):
print "6 ist größer als 4"
Re: local variable 't1' referenced before assignment
Verfasst: Freitag 8. September 2006, 19:01
von BlackJack
cle1986 hat geschrieben:Code: Alles auswählen
def checking(self):
if str(self.starttime) in string.digits:
t1 = true
Wenn die Bedingung hier nicht zutrifft, dann wird ``t1 = true`` nicht ausgeführt...
Code: Alles auswählen
if (t1==true)&(t2==true)&(t3==true)&(t4==true)&(t5==true):
return true
else:
return false
...hier wird aber versucht `t1` mit etwas zu vergleichen...
Jedes mal wenn die obrige Funktion aufgrufen wird, dann bekomme ich jedesmal diese Fehlermeldung:
Traceback (most recent call last):
File "Z:\Eclipse\Pysmig\src\main.py", line 74, in start
if self.checking() == true:
File "Z:\Eclipse\Pysmig\src\main.py", line 90, in checking
if (t1==true)&(t2==true)&(t3==true)&(t4==true)&(t5==true):
UnboundLocalError: local variable 't1' referenced before assignment
...und so beschwert sich der Interpretierer dann wenn er einen lokalen Namen referenzieren soll den es nicht gibt.
Die Funktion soll überprüfung, ob die eingegebenen Daten Zahlen bzw. Text sind.
Das tut sie nicht wirklich. Nehmen wir nur mal den Test auf Ziffern:
Code: Alles auswählen
In [21]: string.digits
Out[21]: '0123456789'
In [22]: '23' in string.digits
Out[22]: True
In [23]: '42' in string.digits
Out[23]: False
Der ``in`` Operator testet ob die erste Zeichenkette in der zweiten
enthalten ist.
Verfasst: Dienstag 12. September 2006, 12:18
von cle1986
So habe mich mal durch eure Kommentare gelesen. Vielen Dank für die Antworten.
Ich habe das mal umgeändert. Was ich aber jetzt immer noch nicht weiss, ist wie ich die Eingaben in den Textfeldern überprüfen kann, ob sie wirklich nur Zahlen enthalten.
Verfasst: Dienstag 12. September 2006, 12:31
von Monk
Das ist einfach:
Code: Alles auswählen
# Sei eingabe der eingegebene Text, zahl der Wert
zahl=0.0
try:
zahl = float(eingabe)
except ValueError:
print "Eine Zahl bitte, nicht %s" % (eingabe,)
else:
print "Die Zahl war %f" % (zahl,)
# Bei Integern float durch int ersetzen und
# %f durch %i
Gruß, der Monk