TypeError: 'bool' object is unsubscriptable

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
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

Samstag 10. Mai 2008, 22:09

Hallo Leute. Ich hab gedacht ich registrier mich hier jetzt mal da hier ja viele Leute sind die der Sprache Python mächtig sind, vielleicht kann mir ja der eine oder andere Behilflich sein. :)

Es geht um folgendes: Ich hab angefangen ein kleines Programm zu schreiben, welches auch eine Config anlegt. Hier hab ich allerdings ein paar Probleme aus dieser Config zu lesen ich weiß leider nicht wie ich das Problem lösen kann, ich hoffe mir kann jemand helfen.

Hier meine Datei in der ich aus der config lese und dementsprechend was ausgeben will:

Code: Alles auswählen

def doSomething():
    config = readConfig("data.conf")
    if int(config["testvar"]) == 0:
        print 'Test'
        
        
def readConfig(file="data.conf"): 
    config = {} 
    try: 
        f = open(file, "r") 
         
        for line in f.readlines(): 
            line = line[:-1] 
            if line[0] == "[": 
                pass 
            else: 
                line = line.split("=") 
                config[line[0][:-1]] = line[1][1:] 
            
        f.close() 
        return config 
 
    except: 
        return False
Es scheint aber irgendwie mit dem lesen nicht zu klappen ich bekomme folgenden
Error: TypeError: 'bool' object is unsubscriptable
Bin leider mit den Fehlermeldungen noch nicht so vertraut, ich denke mal ich kann die Config nicht lesen weil es ein boolscher wert ist und ich versuche den Config Wert in einen int umzuwandeln?

Nur wie mache ich es, das der dann das als Bool ausliest?

Im vorraus bedanke ich mich schon mal, ich komme einfach nicht weiter. :(

beste Grüße Requester

PS.: Nen paar andere Smilies wären auch mal nicht schlecht. :D
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Samstag 10. Mai 2008, 22:28

Hallo und willkommen im Forum!

Nächstes mal wäre es super, wenn du den ganzen Traceback der Fehlermeldung online stellen würdest und nicht nur die letzte Zeile, dann lassen sich Fehler einfacher finden.

Der Fehler liegt in deiner "readConfig"-Funktion. Und zwar wird in den "except"-Block gesprungen und "False" zurückgegeben. Der Zugriff 'config["testvar"]' funktioniert natürlich nicht. Das ist das, was die Fehlermeldung sehr deutlich mitteilt ("unsubscriptable").

Ein paar Hinweise zu deinem Script habe ich natürlich auch noch:

"file" als Variablennamen zu verwenden ist etwas ungünstig, da du damit einen built-in-Namen verdeckst. Nenne es lieber "filename", was so wie so viel passender ist.

Dann ist ein "except" welches alle Fehler abfängt sehr unpraktisch. Damit werden nämlich wirkliche ALLE Fehler verschluckt und du enteckst sie nicht, oder wunderst dich über seltsame Effekte. Besonders schwierig wird es dann bei komplexen Programmen, wenn man nicht genau weiss, von wo ein Seiteneffekt kommt. Außerdem wird die Datei nicht mehr geschlossen. schau dir mal das try-except-finally-Konstrukt in der Doku an. Noch ein kurzes Beispiel

Code: Alles auswählen

f = open(filename, "r")
try:
    #do some file operations
except AnError:
    #do some error handling
finally:
    f.close()
.

Du kannst sogar im except-Block ein "return" machen, der "finally"-Block wird in jedem Fall ausgeführt.

Auch das "return False" ist sehr unglücklich gewählt. Wenn du in Python sagen willst, dass "nichts" zurückgegeben wird, dann schreibst du einfach "return None". Je nach gewünschtem Verhalten könntest du aber in diesem Fall auch ein leeres Dictionary zurückgeben oder eine Exception werfen. Schau dir in der Doku noch mal die "get"-Methode auf Dictionaries an, dort kannst du zum Beispiel auch angeben, was zurückgegeben werden soll, falls ein Schlüssel darin nicht gefunden wurde.

Und das beste zum Schluss: Du musst kein Modul zum lesen einer Konfigurationsdatei selbst entwickelt. Der "ConfigParser" aus der Standardbibliothek kann das schon sehr gut.

Bis dann.
Requester
User
Beiträge: 26
Registriert: Samstag 10. Mai 2008, 21:59

Samstag 10. Mai 2008, 22:37

Sicher das er in den except Block springt?

Also die Fehlermeldung ist diese hier:
if int(config["testvar"]) == 0:
TypeError: 'bool' object is unsubscriptable
Spontant würde ich jetzt sagen das er halt die variable aus der config nicht lesen/laden kann.

Aber ich werde deine Ratschläge mal befolgen und versuchen das anders hinzukriegen.

Danke noch mal für deine schnelle Antwort!

Gruß Requester
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Samstag 10. Mai 2008, 22:38

Requester hat geschrieben:Sicher das er in den except Block springt?
Genau das habe ich gemeint mit den except-Blöcken, die alles verschlucken ;-)

Und bei der Fehlermeldung sollte eigentlich noch mehr stehen. Typischerweise sehen sie so aus:

Code: Alles auswählen

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    False["test"]
TypeError: 'bool' object is unsubscriptable
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 11. Mai 2008, 10:15

Ich tippe ja darauf, dass der Fehler durch diese Zeile entsteht:

Code: Alles auswählen

if line[0] == "[": 
Stefan
BlackJack

Sonntag 11. Mai 2008, 11:01

Die genaue Zeile wurde uns ja schon gezeigt. Davon abgesehen, warum und wo sollte `line` an ein `bool`-Exemplar gebunden werden!?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dienstag 13. Mai 2008, 11:37

Sieht aus, als sollte eine ini-Datei geparst werden. Dafuer gibt's den [mod]configParser[/mod]
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
lunar

Dienstag 13. Mai 2008, 11:47

Oder configobj, für Leute, die ``__getitem__`` schöner finden als ``get`` und Konfigurationsdateien auch gerne mal prüfen möchten.
Antworten