UnboundLocalError unter Linux, nicht jedoch unter WinXP

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
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

Hallo ihr,

ich habe einen UnboundLocalError-Fehler und finde den Grund nicht :( Unter Windows funktioniert es tadellos aber nicht unter Linux:

Code: Alles auswählen

    def getFilecountandFilename(self, folder):
        content = listdir(folder)
        counter = 0
        filenamelist = []
        for entry in content:
            if entry.endswith(self.suffixOPT) == True:
                counter += 1
                filenameuncut = entry
                seperatedfilename = filenameuncut.split('.')
                filenamelist.append(seperatedfilename[0])
            else:
                continue
                
        for each in filenamelist:      
            if each == filenamelist[0]:
                filename = filenamelist[0]
            else:
                print "The inputfolder '%s' contains different filenames. ShakeItBaby can only handle one format per folder." % folder
                sys.exit()
        return counter, filename
Folgende Fehlermeldung :

Code: Alles auswählen

Traceback (most recent call last):
  File "ShakeItBaby.py", line 106, in ?
    rubbeldiekatz = ShakeItBaby()
  File "ShakeItBaby.py", line 33, in __init__
    self.shakeIt()
  File "ShakeItBaby.py", line 84, in shakeIt
    count, filename = self.getFilecountandFilename(folder)
  File "ShakeItBaby.py", line 77, in getFilecountandFilename
    return counter, filename
UnboundLocalError: local variable 'filename' referenced before assignment

Vielleicht habt ihr ja ne Idee :(

Gruß,
Gunnar
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Erklärt sich fast von selbst:
- Er beschert sich, dass in der return-Zeile filename nicht definiert ist.
- Also gucken wir mal: Es solle im letzten if-block gesetzt werden,
(if each == filenamelist[0]), der könnte aber fehlschlagen!
Aber kein Grund zur Panik, dann würde das Programm eh beendet, also ist das Problem schon mal nicht.
- Gucken wir weiter: Der if-Block ist in einer for-Schleife.
Wenn die for-schleife über eine Leere Liste geht, wird ihr body gar nicht ausgeführt!
Also da haben wir das Problem.
filenamelist scheint unter linux in deiner Konstellation leer zu sein, vielleicht gibts deine Dateien unter linux nicht?
Beachte dazu auch, dass Linux und Windows total unterschiedliche Verzeichnisstrukturen haben und auch die Trennzeichen ander sind! (Windows: "\\", Linux: "/")

Noch mal ein paar Hinweise zu einigen Stilblüten:
-- Es macht selten Sinn, mit "== True" zu prüfen.
Der Vergleich mit "== True" liefert dann True zurück, wenn auch der erste Ausdruck True liefert. Ist also doppelt-gemoppelt.
(Du sagst ja auch nicht "Wenn es wahr ist, dass es regnet..." sondern "Wenn es regnet...")

-- else:
continue
...kannst du dir genau so sparen, die Schleife geht auch weiter, wenn ein if-block in ihrem body nicht ausgeführt wurde.

-- Warum gehst du zum Schluß mit einer Schleife durch alle Dateinamen durch, wenn du sowieso nur das erste Element betrachtestet?



Hier mal eine leicht ausfpolierte Version:

Code: Alles auswählen

def get_filecount_and_filename(self, folder):
  content = listdir(folder)
  filenamelist = [f.split(".")[0] for f in content if f.endswith(self.suffixOPT)]
  
  l = len(filenamelist)
  if l != 1:
    raise StandardError("""The inputfolder '%s' contains different \
matching filenames (or no matching filename at all). I can only \
handle exactly one format per folder.""" % folder)
  
  return l, filenamelist[0]
Benutzeravatar
Gunnar
User
Beiträge: 68
Registriert: Samstag 23. Oktober 2004, 08:59

Hallo Henning,

vielen Dank für die ausführliche Erklärung, aber sowas kommt eben heraus, wenn man erstens noch nicht wirklich Python kann und dann die Funktionen mit der heissen Nadel zusammengestrickt werden.

Auf jeden Fall ist es sehr interessant !

Gruß,
Gunnar
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

kein Problem, zum Fragen ist so ein Forum ja da ;-)
Antworten