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
  1. python kennt kein true/false sondern nur True und False
  2. zweitens müsstest du t1/t2/t3/t4/t5 mit False initialisieren
  3. drittens macht man keien Vergleiche mit True/False (schon gar nicht true/false)
  4. 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

Code: Alles auswählen

if t1 and t2 and t3 and t4 and t5:
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

Code: Alles auswählen

if a==True:
    b = True
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