Seite 1 von 1

UnboundLocalError unter Linux, nicht jedoch unter WinXP

Verfasst: Mittwoch 9. November 2005, 22:25
von Gunnar
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

Verfasst: Donnerstag 10. November 2005, 06:41
von henning
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]

Verfasst: Donnerstag 10. November 2005, 15:15
von Gunnar
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

Verfasst: Donnerstag 10. November 2005, 16:50
von henning
kein Problem, zum Fragen ist so ein Forum ja da ;-)