KeyError の原因と直し方
辞書に存在しないキーへアクセスしたときに出るエラーです。大文字小文字の違いも別のキーとして扱われます。
エラーメッセージの読み方
Traceback (most recent call last):
main.py- ファイル名
2- 行番号 — 実際にクラッシュした行
<module>- 発生場所 — <module> ならトップレベル、関数名ならその関数の中
KeyError- 例外クラス — 何が起きたか。ここを検索するのが最短です
'email'- 詳細メッセージ — どの値が問題だったか
このエラーが出る典型パターン
パターン1
1 user = {"name": "Tom", "age": 20} 2 print(user["email"]) ^
Traceback (most recent call last):
File "main.py", line 2, in <module>
print(user["email"])
~~~~^^^^^^^^^
KeyError: 'email'
辞書に存在しないキーへのアクセスはKeyErrorになります。存在確認をしたい場合は.get()やinで先にチェックします。
直し方: "email" を "name" にします。
広告
広告スロット(未設定)
パターン2
1 scores = {"math": 90, "science": 85} 2 print(scores["Math" ]) ^
Traceback (most recent call last):
File "main.py", line 2, in <module>
print(scores["Math"])
~~~~~~^^^^^^^^
KeyError: 'Math'
辞書のキーも大文字小文字を区別します。定義したときと違う大文字小文字を指定すると別のキー扱いになります。
直し方: "Math" を "math" にします。
パターン3
1 config = {"debug": True} 2 print(config["verbose"]) ^
Traceback (most recent call last):
File "main.py", line 2, in <module>
print(config["verbose"])
~~~~~~^^^^^^^^^^^
KeyError: 'verbose'
存在しないキーを指定する典型的な原因は、綴りの思い違いや設定項目名の勘違いです。
直し方: "verbose" を "debug" にします。
よくある誤解
IndexErrorと混同されがちですが、こちらは辞書(キーによるアクセス)専用のエラーです。存在確認をしたい場合はin演算子か.get()を使います。
まとめ
KeyErrorは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。