J'ai une fonction qui fonctionne bien seule, maissoulève une erreur clé lorsque j'essaie de l'utiliser dans une autre fonction. Plutôt que d’essayer d’expliquer le contexte plus large, j’ai pensé qu’il serait plus facile de changer le del hand [lettre], qui est où l'erreur est déclenchée. Dans certains cas, je pourrais simplement changer de main [lettre] en main.get (lettre, aucun), mais je ne peux pas l'utiliser avec l'opérateur del, cela jettera une erreur. Des idées?
hand = {"r": 2, "a": 3, "p": 2, "e": 1, "t": 1, "u":1}
word = "rapture"
def update_hand(hand, word):
"""This function loops through letters, and if the letter is in the
hand, it reduces the corresponding int value by one, until there is
no longer that letter in the hand, then it deletes the key,value pair
all together"""
letters = set(word)
for letter in letters:
if letter in hand.keys():
hand[letter] = hand[letter]-1
if hand[letter] <= 0:
del hand[letter]
return hand
Réponses:
5 pour la réponse № 1Utilisation .pop
Ainsi, dans le cas où la clé n’existe pas, elle ne génère aucune erreur lorsque vous utilisez une valeur par défaut, par exemple None
:
hand.pop(letter, None)
# ^ pops None when the key letter does not exist
Puisque vous avez déjà un chèque pour l’existence de la même clé dans l’un de vos if
conditions, vous pouvez simplement faire:
for letter in letters:
if letter in hand: # same as letter in hand.keys()
hand[letter] = hand[letter] - 1
if hand[letter] <= 0:
hand.pop(letter, None) # del hand[letter] should not throw errors in this case
0 pour la réponse № 2
Si votre fonction "fonctionne bien sur elle-même" mais augmente quand elle est appelée depuis une autre fonction ", la première chose à faire serait de le découvrir. Pourquoi vous avez un problème dans le second cas. Sinon, c’est un exemple canonique de programmation par accident - que nous savons tous ne jamais travailler à long terme.
Maintenant, il y a une cause évidente pour un KeyError
dans le code de votre fonction, ce qui ne dépend pas de quoi que ce soit d'autre que les entrées de la fonction: vous essayez de supprimer une clé sans vérifier d'abord son existence (le if hand[letter] <= 0:
déclaration). Essayez de passer un dict vide pour le hand
param et vous saurez que votre fonction ne pas "fonctionne bien sur son propre".