Code Fix

中級

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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)