web-dev-qa-db-fra.com

Comment éviter KeyError lorsque je travaille avec des dictionnaires?

En ce moment, j'essaye de coder un assembleur mais je continue à avoir cette erreur:

 Traceback (dernier appel passé): 
 Fichier "/Users/Douglas/Documents/NeWS.py", ligne 44, dans 
 si item dans registerTable [item]: 
 KeyError: 'LD' 

J'ai actuellement ce code:

functionTable = {"ADD":"00",
         "SUB":"01",
         "LD" :"10"}

registerTable = {"R0":"00",
         "R1":"00",
         "R2":"00",
         "R3":"00"}

accumulatorTable = {"A"  :"00",
            "B"  :"10",
            "A+B":"11"}

conditionTable = {"JH":"1"}

valueTable = {"0":"0000",
          "1":"0001",
          "2":"0010",
          "3":"0011",
          "4":"0100",
          "5":"0101",
          "6":"0110",
          "7":"0111",
          "8":"1000",
          "9":"1001",
          "10":"1010",
          "11":"1011",
          "12":"1100",
          "13":"1101",
          "14":"1110",
          "15":"1111"}

source = "LD R3 15"

newS = source.split(" ")

for item in newS:

        if item in functionTable[item]:
            functionField = functionTable[item]
        else:
            functionField = "00"

        if item in registerTable[item]:
            registerField = registerTable[item]
        else:
            registerField = "00"

print(functionField + registerField)

L'aide est appréciée.

6
Wigan Pier

Il n'y a pas de clé 'LD' dans registerTable. Peut mettre un essai sauf le bloc:

try:
   a=registerTable[item]
      ...
except KeyError:
   pass
1
akp

Vous cherchez à savoir si la clé potentielle item existe dans le dictionnaire à item. Vous devez simplement supprimer la recherche dans le test.

if item in functionTable:
    ...

Bien que cela puisse même être amélioré.

Il semblerait que vous essayiez de rechercher l'élément ou que vous définissiez «00» par défaut. Les dictionnaires Python ont la fonction intégrée .get(key, default) pour essayer d'obtenir une valeur, ou une valeur par défaut.

Essayer:

functionField = functionTable.get(item, '00')
registerField = registerTable.get(item, '00')
1
Kyle P