Python KeyError란 무엇인가?

KeyError는 딕셔너리(dictionary)에 존재하지 않는 키(key)로 값(value)에 접근하려고 할 때 발생하는 예외다. 딕셔너리는 데이터를 키-값 쌍으로 저장하며, 각 키는 고유해야 한다. 만약 딕셔너리에 없는 키를 사용해 값을 요청하면, Python은 KeyError를 발생시켜 찾으려는 키가 없음을 알린다.

이 오류는 딕셔너리나 다른 매핑(mapping) 타입의 객체에서만 발생한다. 흔히 겪는 문제지만, 다행히 쉽게 예방할 수 있다.

KeyError의 일반적인 원인

KeyError가 발생하는 주된 원인은 다음과 같다.

  • 단순한 오타: 키 이름을 잘못 입력했을 수 있다.
  • 잘못된 데이터 가정: 외부 API나 JSON 파일 같은 데이터를 다룰 때, 특정 키가 항상 존재할 것이라고 가정하는 경우다.
  • 대소문자 구분: 딕셔너리 키는 대소문자를 구분한다. 예를 들어, 'name''Name'은 서로 다른 키로 취급된다.
  • 의도치 않은 삭제: 코드의 다른 부분에서 해당 키가 이미 삭제되었을 수 있다.

다음은 KeyError를 유발하는 간단한 예시다.

my_dict = {'name': 'Alice', 'age': 30}

# 존재하지 않는 키에 접근 시도
print(my_dict['city'])

이 코드를 실행하면 다음과 같은 결과가 나온다.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'city'

KeyError 해결 방법

KeyError를 처리하거나 예방하는 몇 가지 방법이 있다.

1. in 키워드로 키 존재 여부 확인

키에 접근하기 전에 in 키워드를 사용해 해당 키가 딕셔너리에 존재하는지 확인할 수 있다. 이는 가장 직관적이고 가독성이 좋은 방법이다.

my_dict = {'name': 'Alice', 'age': 30}
key_to_check = 'city'

if key_to_check in my_dict:
    print(my_dict[key_to_check])
else:
    print(f"'{key_to_check}' 키가 존재하지 않습니다.")

이 코드는 키 존재 여부를 안전하게 확인하여 오류를 피하고, 대신 유용한 메시지를 출력한다.

2. .get() 메서드 사용

딕셔너리의 .get() 메서드는 이 문제를 해결하는 가장 Pythonic한 방법 중 하나다. 이 메서드는 키를 사용해 값을 가져오려고 시도하며, 만약 키가 없으면 KeyError를 발생시키는 대신 기본값으로 None을 반환한다.

또한, 키가 없을 때 반환할 기본값을 직접 지정할 수도 있다.

my_dict = {'name': 'Alice', 'age': 30}

# 'city' 키가 없으므로 None을 반환
city = my_dict.get('city')
print(city)  # 출력: None

# 키가 없을 경우 지정한 기본값을 반환
country = my_dict.get('country', 'Unknown')
print(country)  # 출력: Unknown

.get()을 사용하면 코드가 더 간결하고 안정적으로 변한다.

3. try...except 블록 사용

만약 키가 없는 상황이 예외적인 경우에만 발생할 것으로 예상된다면, try...except 블록을 사용해 KeyError를 잡을 수 있다. 이는 키의 부재가 특별한 처리가 필요한 오류 상황을 의미할 때 유용하다.

my_dict = {'name': 'Alice', 'age': 30}

try:
    city = my_dict['city']
    print(city)
except KeyError:
    print("'city' 키를 딕셔너리에서 찾을 수 없습니다.")
    # 여기에 다른 오류 처리 로직을 추가할 수 있다

이 접근 방식은 주된 로직을 깔끔하게 유지하면서 오류를 처리할 명확한 경로를 제공한다.

결론

Python의 KeyError는 존재하지 않는 딕셔너리 키에 접근하려 할 때 발생하는 신호다. in 키워드를 사용한 간단한 확인, 유연한 .get() 메서드, 또는 try...except를 이용한 구조적인 오류 처리를 통해 더 안정적이고 오류 없는 코드를 작성할 수 있다. 어떤 방법을 선택할지는 특정 요구사항과 프로그램에서 키가 없는 상황이 예상된 시나리오인지, 아니면 예외적인 이벤트인지에 따라 달라진다.

Leave a comment