Seite 1 von 1

seltsamer KeyError

Verfasst: Donnerstag 28. Februar 2008, 14:53
von meneliel
Guten Tag,

Ich habe gerade mal wieder mit einer sehr seltsamen Fehlermeldung zu kämpfen, die ich mir nicht erklären kann:

Fehlermeldung: KeyError:('a','b')

Ist für mich sehr unlogisch.

Was passiert: Ich selektiere aus einer MySQL Datenbank daten. Eines der selektierten Attribute ist gleichzeitig Schlüssel in einem Dictionary. Je nachdem in welchen von ca 7. Dictionarys er enthalten ist, wird eine entsprechend eine Funktion aufgerufen. Das funktioniert auch.
Als nächstes will ich die in einem Tupel gespeicherten Values zu dem Schlüssel abrufen und bekomme den KeyError, der mir gleichzietig das Tupel anzeigt. 2 Gründe warum er den Schlüssel kennt und es den gbit: 1. wurde die richtige Funktion aufgrufen, 2. seh ich in der Fehlermeldung das korrekte, dem Schlüssel zugeordnete Wertepaar. Warum kommt dann diese Fehlermeldung?

Hier der Code:

Code: Alles auswählen

elif i_nr[0] in dict_T1:
    x = T1(y, dict_T1[i_nr[0]],a,b,c)

# Hier der Anfang der Funktion T1:
def T1(y,key, a,b,c):
    prin dict_T1
    print dict_T1[key]
    I_A1 = dict_T1[key][0]
    ....
Das Dictionary kann ich noch ausgben, aber sobad ich dict_t1[key] aufrufe, kommt die Fehlermeldung von oben. Und ich hab keine Ahnung warum :(

EDIT: btw in der Shell funktioniert es. ALso wenn ich manuel key mit dem Schlüssel belege und dann die dict_T1[key] aufrufe.

Verfasst: Donnerstag 28. Februar 2008, 15:18
von BlackJack
Ich bin etwas verwirrt, `T1()` wird mit ``dict_T1[i_nr[0]]`` als `key`-Argument aufgerufen. Das heisst in `T1()` wird `I_A1` der Wert von ``dict_T1[dict_T1[i_nr[0]]][0]`` zugewiesen. Selbst bei einer besseren Namensgebung würde ich da Kopfschmerzen vom drüber Nachdenken bekommen. ;-)

Bist Du sicher das das zweite Argument beim Aufruf nicht nur ``i_nr[0]`` sein sollte!?

Verfasst: Donnerstag 28. Februar 2008, 15:31
von meneliel
*kopf gegen Wand schlag*

arg .... genau das war es .... :oops: Danke

btw: ich krieg auch schon Kopfschmerzen davon. Zwar nicht, weil ich den value eines dict. ausversehen als Key benutze, aber von den ganzen Dictionaries an sich .... ;-)

Gibt ja noch mehr davon und über values aus einem, die gleichzeit keys in einem weiteren dictionary sind, werden dort aus nem Tupel Werte geholt ... das sind z.Z [][][][] dahinter :S *so langsam etwas den durchblick verlieren :()

Verfasst: Donnerstag 28. Februar 2008, 16:47
von Leonidas
Sieht nach einem Fall von misslungener-Programm-Struktur aus - Refactoring wird nötig. Dann kannst du statt Dicts etwas spezifische Datentypen bauen um dein Problem simpler zu lösen.

Verfasst: Donnerstag 28. Februar 2008, 16:59
von meneliel
:( sooo misslungen finde ich die gar nicht.

Für jeden aus der Datenbank gezogenen Eintrag soll was berechnet werden. Viele der zu berechnenden Werte kann man in Gruppen mit gleicher Berechnungsvorshrift zusammenfassen, so gibt es für jede Gruppe ein Dictionary.

Die spezifischen dafür benötigten Attribute stehen in den Dictionaries.
Das einzige Problem, warum das so verschachtelt wird, ist, dass man für einige der zu berechnenden Werte andere braucht, das heißt, wenn es einen Wert, der in Dict_B fallen würde, berechnen will und den entsprechenden Wert A gibt es noch nicht, muss dann A berechnet werden erst ...

Was gäbe es denn für eine Alternative zu den Dict.?

Verfasst: Donnerstag 28. Februar 2008, 17:16
von BlackJack
Alternative wären Klassen/Objekte mit den entsprechenden Daten und Methoden.

Verfasst: Donnerstag 28. Februar 2008, 17:28
von meneliel
.. :? :( ... da war was was demnächst noch auf der To-Do-Liste stand.


Ich wüsste aber dennoch nicht, wie ich so um die Dictionaries herum komme. :(
EDIT: außer ich würde dann die konkreten Werte/Daten in den Objekten mit abspeichern?? Uff... Da muss ich mal nen Plan machen (bzw. erst mal einen bekommen) ... mit oop tu ich mich ein wenig schwer. Also das Klassen/Objekte/Methoden Konzept einschließlich Vererbung, kapieren tu ich das schon ... nur das auch umzusetzen... fällt mir schwer ...