콘텐츠로 건너뛰기

KeyError를 해결하는 방법

CodeMDD.io

Python KeyError 예외와 처리 방법

Python의 KeyError 예외는 초보자들이 자주 마주치는 예외입니다. KeyError가 발생하는 이유를 알고, 프로그램을 중단하지 않고 예외를 처리할 수 있는 몇 가지 해결책을 알아봄으로써 Python 프로그래머로서의 능력을 향상시키는 필수 단계입니다.

이 튜토리얼의 끝에는 다음과 같은 내용들을 알게 될 것입니다:

  • Python KeyError가 일반적으로 무엇을 의미하는지
  • 표준 라이브러리에서 어떤 상황에서 KeyError를 볼 수 있는지
  • KeyError를 발생시킬 때 어떻게 처리하는지

Python KeyError의 일반적인 의미

Python의 공식 문서에 따르면 KeyError는 액세스하려는 키가 매핑에서 찾을 수 없을 때 발생합니다. 매핑이란 한 세트의 값이 다른 세트의 값과 매핑되는 데이터 구조입니다. Python에서 가장 일반적으로 사용되는 매핑은 딕셔너리입니다.

Python KeyErrorLookupError 예외의 한 종류입니다. 이 예외는 찾으려는 키를 검색하는 중에 문제가 발생했음을 나타냅니다. KeyError를 볼 때 의미적으로 주어진 키를 찾을 수 없다는 것입니다.

다음 예제에서는 세 명의 사람의 나이가 포함된 딕셔너리(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가 발생합니다. traceback의 마지막 줄에는 다음과 같은 관련 정보가 표시됩니다:

  • KeyError가 발생했다는 사실
  • 찾을 수 없는 키인 'Michael'

두 번째에서 마지막 줄은 예외를 발생시킨 라인을 알려줍니다. 이 정보는 파일에서 실행하는 경우 보다 유용합니다.

다음 프로그램에서는 ages 딕셔너리가 다시 정의되어 있습니다. 이번에는 나이를 검색할 사람의 이름을 입력하도록 요청받습니다:

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

이 코드는 프롬프트에서 입력한 이름을 사용하여 해당 사람의 나이를 가져오려 합니다. 프롬프트에서 입력하는 내용은 다음과 같습니다:

Get age for:

여기서 이름을 제공하면 해당 사람의 나이를 가져오려고 시도합니다. 이때 입력한 이름이 딕셔너리에 존재하지 않으면 KeyError가 발생합니다.

표준 라이브러리에서 KeyError를 볼 수 있는 다른 상황

KeyError는 딕셔너리 뿐만 아니라 표준 라이브러리의 다른 부분에서 발생할 수도 있습니다. 예를 들어, 리스트와 같은 순서가 있는 컨테이너도 아이템을 인덱스로 액세스할 때 KeyError가 발생할 수 있습니다.

다음은 특정 인덱스의 아이템을 가져오려고 할 때 발생하는 KeyError의 예입니다:

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

여기서 [3]을 인덱스로 사용해서 세 번째 인덱스에 있는 아이템을 가져오려고 하면 KeyError 대신 IndexError가 발생합니다. 리스트는 인덱스를 기반으로 데이터에 액세스하므로 인덱스가 범위를 벗어나면 IndexError가 발생합니다.

딕셔너리나 다른 컨테이너에서 KeyError가 발생하는 상황을 자세히 이해하는 것은 예외 처리 및 디버깅을 위해 중요합니다.

KeyError를 발생시켜야 할 때

가끔씩은 사용자 정의 코드에서 의도적으로 KeyError를 발생시켜야 할 때도 있습니다. 예를 들어, 특정 키가 딕셔너리에 없을 때 특정 동작을 수행하거나 사용자에게 알려야 할 때가 있습니다.

다음 예제에서는 사용자 정의 함수 get_value()가 주어진 키를 이용해 딕셔너리에서 값을 가져오는데, 키가 딕셔너리에 없을 때 KeyError를 발생시켜 사용자에게 알리고자 합니다:

def get_value(dictionary, key):
try:
return dictionary[key]
except KeyError:
print(f'The key "{key}" does not exist in the dictionary')
ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
get_value(ages, 'Michael')

이 예제에서는 딕셔너리에 존재하지 않는 키인 'Michael'get_value() 함수로 전달하면 KeyError가 발생하고, except KeyError 블록이 실행됩니다. 이 블록은 딕셔너리에 키가 없다는 사실을 출력합니다.

이와 같은 방식으로 KeyError를 사용하면 예외를 처리하고 다음 동작을 수행함으로써 프로그램이 중단되지 않게 할 수 있습니다.

KeyError 처리 방법

KeyError를 처리하는 방법은 여러 가지가 있습니다. 가능한 해결책을 제시하기 전에 KeyError를 처리하는 데 사용할 수 있는 몇 가지 일반적인 기술을 살펴보겠습니다.

일반적인 해결책: .get()

파이썬의 딕셔너리 객체에는 .get() 메서드가 있습니다. .get() 메서드는 주어진 키에 해당하는 값을 반환하는데, 키가 딕셔너리에 없는 경우 None을 반환합니다. .get() 메서드를 사용하면 KeyError를 발생시킬 필요 없이 키의 존재 여부를 확인할 수 있습니다.

다음은 .get() 메서드를 사용하여 딕셔너리에 키가 있는지 확인하고, 키의 값을 가져오는 예입니다:

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

ages 딕셔너리에 'Michael' 키가 없으므로 .get() 메서드는 None을 반환합니다. 따라서 조건문을 통과하지 않고 아무런 동작도 수행되지 않습니다.

.get() 메서드는 키의 값을 가져오거나 디폴트 값을 반환할 필요가 있는 경우 특히 유용합니다. 키의 값이 없으면 디폴트 값을 반환하도록 설정할 수도 있습니다. 예를 들어, 딕셔너리에 특정 키가 있으면 해당 값을 가져오고 없으면 기본값인 0을 반환하도록 설정할 수 있습니다:

counts = {'apple': 5, 'banana': 3, 'kiwi': 2}
count = counts.get('pear', 0)
print(count) # 출력: 0

드물게 사용되는 해결책: 키 존재 여부 확인

딕셔너리에 만약 키가 존재하지 않는지 확인하는 것 만으로도 KeyError를 회피할 수 있습니다. 이를 위해 in 키워드를 사용하여 확인하면 됩니다.

다음은 'Michael' 키가 ages 딕셔너리에 있는지 확인하는 예시입니다:

ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
if 'Michael' in ages:
print("Michael's age is", ages['Michael'], "years old.")

'Michael' 키가 ages 딕셔너리에 없으므로 조건문이 거짓이 되어 아무런 동작도 수행되지 않습니다.

딕셔너리에 키가 있는지 확인하는 것은 KeyError를 발생시킬 필요 없이 키의 존재 여부를 간단하게 확인할 수 있는 방법 중 하나입니다.

일반적인 해결책: try-except

파이썬에서 가장 일반적으로 사용되는 예외 처리 방법은 try-except 문을 사용하는 것입니다. try 블록 안에 예외가 발생할 수 있는 코드를 작성하고, 해당 예외를 처리할 except 블록을 사용하여 예외 처리를 수행합니다.

다음은 try-except 문을 사용하여 KeyError 예외를 처리하는 예입니다:

ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
try:
print("Michael's age is", ages['Michael'], "years old.")
except KeyError:
print("Michael's age is unknown.")

try 블록 안에 'Michael' 키를 이용해 딕셔너리에서 값을 가져오는 코드가 있습니다. 이 코드에서 KeyError가 발생하면 예외 처리가 시작됩니다. except KeyError 블록은 KeyError 예외를 처리하고, 해당 예외가 발생했을 때 수행할 코드를 정의합니다.

try-except 문을 사용하면 예외를 처리할 수 있으므로 프로그램이 중단되지 않습니다.

결론

Python의 KeyError 예외는 딕셔너리나 다른 컨테이너에서 키에 해당하는 요소를 찾을 수 없을 때 발생합니다. KeyError를 이해하고 이를 처리하는 방법을 알아냄으로써 프로그램의 예외를 처리할 수 있는 기술에 대해 배웠습니다.

이 튜토리얼에서 배운 내용을 요약하면 다음과 같습니다:

  • Python KeyError의 일반적인 의미
  • 표준 라이브러리에서 KeyError를 볼 수 있는 다른 상황
  • KeyError를 발생시켜야 할 때
  • KeyError를 처리하는 방법

Python 코드에 대한 자세한 설명과 예제 코드는 이 튜토리얼을 따라하시면서 확인해볼 수 있습니다. 이를 통해 KeyError 예외의 원인과 처리 방법을 더 잘 이해할 수 있을 것입니다.