Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 KeyError 완벽 가이드: 초보자를 위한 원인 분석과 해결 방법

파이썬에서 KeyError는 딕셔너리에 존재하지 않는 항목(키)에 접근하려 할 때 발생하는 오류입니다. 실제로 존재하는 키를 조회하도록 코드를 수정하거나, 키의 존재 여부를 미리 확인하는 방식으로 손쉽게 해결할 수 있습니다.

파이썬 KeyError란?

갑자기 KeyError 메시지를 마주하고 당황하셨나요? 걱정하지 마세요. KeyError는 단순히 "현재 접근하려는 키가 딕셔너리 안에 없다"는 뜻일 뿐입니다. 원인과 해결 방법만 알면 누구나 쉽게 처리할 수 있습니다.

KeyError는 주로 다음 세 가지 방법으로 처리할 수 있습니다.

  • get() 메서드를 사용해 기본값 반환받기
  • in 연산자로 키 존재 여부를 미리 확인하기
  • try…except 블록으로 예외 처리하기

이 글에서는 KeyError가 발생하는 이유를 살펴보고, 실제 오류 예제와 함께 각 해결 방법을 단계별로 알아보겠습니다.

딕셔너리의 기본 구조

파이썬 딕셔너리는 중괄호({}) 안에 키(key)와 값(value) 쌍을 저장하는 자료형입니다.

raspberry_pi = {
    "name": "Raspberry Pi 4",
    "price": 35.00,
    "RAM": "4GB"
}

여기서 키는 "name", "price", "RAM"입니다. 딕셔너리에서 키는 콜론(:) 앞에 위치합니다.

오류 발생 예시

그렇다면 딕셔너리에 없는 키를 조회하면 어떻게 될까요? USB 포트 개수를 조회해 보겠습니다.

print(raspberry_pi["usb_ports"])

실행 결과는 다음과 같습니다.

KeyError: 'usb_ports'

이 오류 메시지는 지정한 키가 존재하지 않는다는 의미입니다. 여기서는 "usb_ports"라는 키가 딕셔너리에 없기 때문에 KeyError가 발생했습니다. 오류 메시지에 표시되는 키 이름을 보면 어떤 키가 문제였는지 바로 파악할 수 있다는 점을 기억해 두세요.

KeyError 해결 방법 3가지

1. get() 메서드 활용하기

딕셔너리의 get() 메서드는 키에 해당하는 값을 반환하며, 두 번째 인자로 기본값(default)을 지정할 수 있습니다. 키가 존재하지 않으면 KeyError 대신 지정한 기본값이 반환됩니다.

raspberry_pi = { "name": "Raspberry Pi 4", "price": 35.00, "RAM": "4GB" }

get_key = input("어떤 정보를 조회하시겠습니까? (name, price, RAM) ")

print("{} 정보: {}".format(get_key, raspberry_pi.get(get_key, "정보 없음")))

실행 결과:

어떤 정보를 조회하시겠습니까? (name, price, RAM) ALU
ALU 정보: 정보 없음

"ALU"라는 키는 딕셔너리에 없으므로, get() 메서드는 미리 지정해 둔 기본값인 "정보 없음"을 반환합니다. KeyError 없이 안전하게 처리된 것입니다.

2. in 연산자로 키 존재 여부 확인하기

in은 파이썬의 멤버십 연산자로, 특정 항목이 리스트나 딕셔너리 등에 포함되어 있는지 검사합니다. 딕셔너리에 사용하면 해당 키의 존재 여부를 확인할 수 있습니다.

주의할 점은, if raspberry_pi[get_key]:처럼 인덱싱 자체로 키 존재를 검사하면 키가 없을 경우 그 자리에서 KeyError가 발생한다는 것입니다. 따라서 반드시 in 연산자로 먼저 확인한 뒤 키에 접근하는 것이 안전합니다.

raspberry_pi = { "name": "Raspberry Pi 4", "price": 35.00, "RAM": "4GB" }

get_key = input("어떤 정보를 조회하시겠습니까? (name, price, RAM) ")

if get_key in raspberry_pi:
    print("{} 정보: {}".format(get_key, raspberry_pi[get_key]))
else:
    print("해당 정보는 제공되지 않습니다.")

이 코드는 "get_key" 값이 "raspberry_pi" 딕셔너리의 키인지 먼저 검사합니다. 키가 존재하면 if문이 실행되고, 존재하지 않으면 else문이 실행됩니다.

존재하는 키를 조회하면:

어떤 정보를 조회하시겠습니까? (name, price, RAM) name
name 정보: Raspberry Pi 4

존재하지 않는 키를 조회하면:

어떤 정보를 조회하시겠습니까? (name, price, RAM) CPU
해당 정보는 제공되지 않습니다.

else 블록에서는 존재하지 않는 키에 접근하지 않기 때문에, 어떤 입력을 넣더라도 KeyError가 발생하지 않습니다.

3. try…except 블록으로 예외 처리하기

try…except 블록은 코드를 실행해 보고, 오류가 발생하면 지정한 예외 처리 로직을 실행하는 구조입니다. KeyError가 발생할 가능성이 있는 코드를 try 블록에 넣고, except 블록에서 적절한 대응을 정의할 수 있습니다.

raspberry_pi = { "name": "Raspberry Pi 4", "price": 35.00, "RAM": "4GB" }

get_key = input("어떤 정보를 조회하시겠습니까? (name, price, RAM) ")

try:
    print("{} 정보: {}".format(get_key, raspberry_pi[get_key]))
except KeyError:
    print("해당 정보는 제공되지 않습니다.")

try 블록에서 라즈베리 파이의 정보를 출력하려 시도하고, 이 과정에서 KeyError가 발생하면 except 블록의 내용이 실행됩니다.

키가 존재하는 경우:

어떤 정보를 조회하시겠습니까? (name, price, RAM) name
name 정보: Raspberry Pi 4

키가 존재하지 않는 경우:

어떤 정보를 조회하시겠습니까? (name, price, RAM) USB
해당 정보는 제공되지 않습니다.

"USB"라는 키가 없어 try 블록 안에서 KeyError가 발생했고, 그 결과 except 블록이 실행된 것입니다.

마무리

KeyError는 딕셔너리에 존재하지 않는 키에 접근하려 할 때 발생하는 오류입니다. 해결 방법을 정리하면 다음과 같습니다.

  • get() 메서드: 키가 없을 때 반환할 기본값을 지정
  • in 연산자: 키를 사용하기 전에 존재 여부를 미리 검사
  • try…except 블록: 오류 발생 상황을 명시적으로 처리

상황에 따라 가장 적합한 방법이 다르므로, 코드의 목적과 가독성을 고려해 선택하시기 바랍니다. 이 세 가지 패턴만 익혀도 딕셔너리 관련 오류의 대부분을 깔끔하게 처리할 수 있습니다.