local variable 't1' referenced before assignment

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
cle1986
User
Beiträge: 18
Registriert: Donnerstag 7. September 2006, 12:44

Freitag 8. September 2006, 16:36

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

Freitag 8. September 2006, 17:29

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 &
TUFKAB – the user formerly known as blackbird
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 8. September 2006, 17:34

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Freitag 8. September 2006, 17:56

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

Freitag 8. September 2006, 18:27

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"
BlackJack

Freitag 8. September 2006, 19:01

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.
cle1986
User
Beiträge: 18
Registriert: Donnerstag 7. September 2006, 12:44

Dienstag 12. September 2006, 12:18

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.
Monk
User
Beiträge: 16
Registriert: Montag 28. August 2006, 11:27

Dienstag 12. September 2006, 12:31

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
Antworten