seltsamer KeyError

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
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

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.
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!?
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

*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 :()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

:( 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.?
BlackJack

Alternative wären Klassen/Objekte mit den entsprechenden Daten und Methoden.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

.. :? :( ... 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 ...
Antworten