コンテンツにスキップ

キーワードエラーの修正方法を簡単に解説

CodeMDD.io

Python KeyError例外とそのハンドリング方法

PythonのKeyError例外は、初心者によく遭遇する例外です。KeyErrorが発生する原因と、プログラムが停止するのを防ぐためのいくつかの解決策を知ることは、Pythonプログラマーとしてのスキル向上に必要なステップです。

このチュートリアルの終わりまでに、次のことを知るようになります:

  • PythonのKeyErrorが通常何を意味するか
  • 標準ライブラリでKeyErrorが他でどこで発生するか
  • KeyErrorを見たときのハンドリング方法

Free Bonus: ここをクリックして無料のPythonチートシートを入手して、Python 3の基本操作、データ型、辞書、リスト、そしてPython関数の使い方を学びましょう。

PythonのKeyErrorの通常の意味

Pythonの公式ドキュメントによると、KeyErrorは、マッピングキーにアクセスしてマッピング内に見つからなかった場合に発生します。マッピングは、一連の値を別の値にマッピングするデータ構造です。Pythonで最も一般的なマッピングは辞書です。

PythonのKeyErrorは、LookupError例外の一種であり、探しているキーを取得する際に問題があったことを示します。KeyErrorを見たときの意味は、探しているキーが見つからなかったことです。

以下の例では、3人の年齢が定義された辞書 (ages) を見ることができます。辞書内に存在しないキーにアクセスしようとすると、KeyErrorが発生します:

>>> ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
>>> ages['Michael']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Michael'

ここでは、ages辞書でキー'Michael'にアクセスしようとすると、KeyErrorが発生します。トレースバックの一番下には、次の情報が表示されます:

  • KeyErrorが発生したこと
  • 見つからなかったキーである'Michael'

最後から2番目の行には、例外が発生した行が表示されます。ファイルからPythonコードを実行する際には、この情報がより役立ちます。

注意: Pythonで例外が発生するときには、トレースバックが表示されます。トレースバックには、例外がなぜ発生し、それが引き起こされた要因を判断するために必要なすべての関連情報が含まれています。

次のプログラムでは、ages辞書が再び定義されています。この時、人物の名前を指定するように促されます:

ages.py
ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
person = input('Get age for: ')
print(f'{person} is {ages[person]} years old.')

このコードでは、プロンプトで入力する名前を受け取り、その人物の年齢を取得しようとします。プロンプトに入力した内容は次の行のages[person]で使用されます。

このプログラムを実行すると、次のような結果が表示されます:

ターミナルウィンドウ
Get age for: Michael
Traceback (most recent call last):
File "ages.py", line 4, in <module>
print(f'{person} is {ages[person]} years old.')
KeyError: 'Michael'

プロンプトにMichaelと入力すると、KeyErrorが発生します。トレースバックには、ファイルの行数とエラーメッセージが表示されます。

このプログラムでは、プロンプトで入力された名前に対応する年齢を取得しようとしますが、ages辞書に該当するキーが存在しないため、KeyErrorが発生します。

これがPythonのKeyErrorが通常何を意味するのかの概要です。次に、標準ライブラリでKeyErrorをどこで見ることができるかを見てみましょう。

標準ライブラリでのPython KeyErrorの発生場所

Pythonの標準ライブラリでは、さまざまな場所でKeyErrorが発生する可能性があります。以下では、いくつかの具体的な例を紹介します:

辞書 (dict)

先程も説明したように、辞書 (dict) はPythonで最も一般的なマッピングです。辞書では、存在しないキーにアクセスしようとするとKeyErrorが発生します。

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> d['d']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'd'

リスト (list)

リスト (list) はインデックスで要素にアクセスしますが、存在しないインデックスにアクセスするとIndexErrorではなくKeyErrorが発生します。

>>> lst = [1, 2, 3]
>>> lst[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

セット (set)

セット (set) も辞書と同様に、存在しない要素にアクセスするとKeyErrorが発生します。

>>> s = {1, 2, 3}
>>> s[4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support indexing

タプル (tuple)

タプル (tuple) は不変性があり、辞書と同じく存在しないインデックスにアクセスするとKeyErrorが発生します。

>>> t = (1, 2, 3)
>>> t[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range

これらは、Pythonの標準ライブラリの一部でKeyErrorが発生する例です。では、自分自身のコードでKeyErrorを発生させる必要がある場合はどうなるのでしょうか?

自分自身のコードでPython KeyErrorの発生

自分のコードでKeyErrorを発生させる必要がある場合は、次のようなシナリオがあるかもしれません:

  • キーが存在するかどうかを確認する必要がある場合
  • 辞書以外のデータ構造でキーを使用するためのチェックが必要な場合

KeyErrorを発生させる必要がある場合にどのように対処すれば良いかを考えてみましょう。

Python KeyErrorをハンドリングする方法

PythonのKeyErrorをハンドリングするためには、いくつかの方法があります。以下では、いくつかの一般的なケースとその対処法を紹介します。

一般的な解決策: .get()

辞書 (dict) のキーが存在するかどうかをチェックするために、.get()メソッドを使用する方法があります。.get()メソッドを使用すると、指定したキーが存在しない場合に発生するKeyErrorを回避することができます。

以下の例では、辞書 ages 内のキー 'Michael' の存在をチェックし、キーが存在する場合はその値を取得して表示します。キーが存在しない場合は、デフォルト値 None を返します。

ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
age = ages.get('Michael')
if age is not None:
print(f'Michael is {age} years old.')
else:
print('Michael is not in the ages dictionary.')

このコードを実行すると、キーが存在しない場合にKeyErrorが発生せず、代わりにメッセージ 'Michael is not in the ages dictionary.' が表示されます。

.get()メソッドは、キーが存在するかどうかを検証するための一般的な解決策です。次に、より少なくとも一度はキーが存在することがわかっている場合の解決策を見てみましょう。

珍しい解決策: キーのチェック

キーが辞書 (dict) 内に存在することを事前に知っている場合は、in演算子を使用してキーの存在を確認できます。

以下の例では、辞書 ages 内のキー 'Michael' の存在を事前にチェックし、キーが存在する場合のみその値を取得して表示します。

ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
if 'Michael' in ages:
print(f'Michael is {ages["Michael"]} years old.')
else:
print('Michael is not in the ages dictionary.')

このコードを実行すると、キーが存在しない場合にKeyErrorが発生せず、代わりにメッセージ 'Michael is not in the ages dictionary.' が表示されます。

この方法は、キーがあることが分かっている場合に適していますが、キーが存在するかどうかをチェックするために毎回if文を使用する必要があります。そのため、通常は.get()メソッドを使用する方が効率的です。

次に、一般的な解決策と珍しい解決策を組み合わせて、さらに汎用的な解決策を見てみましょう。

一般的な解決策: try except

PythonのKeyErrorをハンドリングするもっとも一般的な方法は、try except文を使用することです。

以下の例では、辞書 ages 内のキー 'Michael' の存在をチェックし、キーが存在する場合はその値を取得して表示します。キーが存在しない場合は、KeyErrorが発生する可能性があるため、try except文を使用して例外をハンドリングします。

ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
try:
age = ages['Michael']
print(f'Michael is {age} years old.')
except KeyError:
print('Michael is not in the ages dictionary.')

このコードを実行すると、キーが存在しない場合にKeyErrorが発生せず、代わりにメッセージ 'Michael is not in the ages dictionary.' が表示されます。

try except文を使用することで、プログラムが正常に動作するかどうかに関わらず、例外が発生してもエラーを表示せずに継続することができます。

結論

PythonのKeyError例外は、辞書や他のマッピングで存在しないキーにアクセスしようとした場合に発生します。このチュートリアルでは、KeyErrorが通常何を意味し、どのようにハンドリングするかについて説明しました。

PythonのKeyErrorを理解し、適切にハンドリングすることで、より効果的なプログラムを作成することができるでしょう。