Erreur Python : KeyError
NSI Première
Définition
La `KeyError` survient quand tu essaies d'accéder à une clé qui n'existe pas dans un dictionnaire. Python affiche un message du type `KeyError: 'nom_de_la_cle'`, où la valeur indiquée est précisément la clé introuvable. C'est l'équivalent, pour les dictionnaires, de l'`IndexError` des listes : tu demandes une entrée qui n'a jamais été créée (ou dont le nom est mal orthographié).
Exemple corrigé
Énoncé
Voici un code qui déclenche cette erreur :
```python
notes = {"Maths": 15, "NSI": 18, "Anglais": 12}
# On veut afficher la note de physique
print("Note en Physique :", notes["Physique"])
```
Exécution :
```
Traceback (most recent call last):
File "notes.py", line 4, in <module>
print("Note en Physique :", notes["Physique"])
KeyError: 'Physique'
```
Solution
La cause est simple : la clé `"Physique"` n'a jamais été ajoutée au dictionnaire `notes`. Comme elle n'existe pas, l'accès direct avec les crochets `notes["Physique"]` échoue.
Deux façons de corriger, selon le besoin :
1. Utiliser la méthode `.get()` qui renvoie une valeur par défaut au lieu de planter :
```python
notes = {"Maths": 15, "NSI": 18, "Anglais": 12}
# Renvoie "absente" si la clé n'existe pas, sans erreur
print("Note en Physique :", notes.get("Physique", "absente"))
```
2. Vérifier la présence de la clé avec `in` avant d'y accéder :
```python
if "Physique" in notes:
print("Note en Physique :", notes["Physique"])
else:
print("Pas de note en Physique.")
```
Le bon réflexe : quand tu n'es pas sûr qu'une clé existe, utilise `dico.get(cle, valeur_par_defaut)` ou teste avec `cle in dico` plutôt qu'un accès direct par crochets.
Erreurs classiques
- Confondre `KeyError` (clé absente d'un dictionnaire) et `IndexError` (indice hors limites d'une liste) : ce sont deux structures différentes.
- Une faute de frappe ou de casse dans le nom de la clé déclenche aussi l'erreur : `notes["maths"]` échoue si la clé enregistrée est `"Maths"` (Python distingue majuscules et minuscules).
- Croire que `notes.get("Physique")` plante : non, sans valeur par défaut il renvoie `None` silencieusement, ce qui peut masquer un bug plus loin.