불변 딕셔너리 구현하기

PythonBeginner
지금 연습하기

소개

이 프로젝트에서는 Python 에서 불변 딕셔너리 (immutable dictionary) 를 구현하는 방법을 배우게 됩니다. 불변 딕셔너리는 생성 후 수정할 수 없는 데이터 구조로, 데이터가 변경되지 않아야 하는 특정 애플리케이션에서 유용합니다.

👀 미리보기

d["Connection"]='kee-alive'
d["Host"]='www.labex.io'
TypeError("'ImmutableDict' objects are immutable")
TypeError("'ImmutableDict' objects are immutable")
d.get("Host")='www.labex.io'

🎯 과제

이 프로젝트에서는 다음을 배우게 됩니다:

  • 내장 dict 클래스를 상속하는 ImmutableDict 클래스를 만드는 방법
  • 딕셔너리 수정을 방지하기 위해 ImmutableDict 클래스에서 메서드를 구현하는 방법
  • ImmutableDict 클래스가 예상대로 작동하는지 테스트하는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다:

  • 불변 데이터 구조 (immutable data structure) 의 개념과 사용 사례를 이해합니다.
  • ImmutableDict 클래스를 사용하여 Python 에서 불변 딕셔너리를 구현합니다.
  • 적절한 메서드를 재정의하여 딕셔너리 수정을 방지합니다.
  • ImmutableDict 클래스가 예상대로 작동하는지 테스트합니다.

ImmutableDict 클래스 구현하기

이 단계에서는 immutable_dict.py 파일에서 ImmutableDict 클래스를 구현하는 방법을 배우게 됩니다. 이 단계를 완료하려면 아래 단계를 따르세요:

  1. /home/labex/project 디렉토리에 있는 immutable_dict.py 파일을 엽니다.
  2. 내장 dict 클래스를 상속하는 ImmutableDict라는 새 클래스를 만듭니다.
class ImmutableDict(dict):
  1. 딕셔너리를 불변 (immutable) 으로 만들기 위해 ImmutableDict 클래스에서 다음 메서드를 구현합니다:
def __setitem__(self, key, value):
    raise TypeError("'ImmutableDict' objects are immutable")

def __delitem__(self, key):
    raise TypeError("'ImmutableDict' objects are immutable")

def pop(self, key, default=None):
    raise TypeError("'ImmutableDict' objects are immutable")

def popitem(self):
    raise TypeError("'ImmutableDict' objects are immutable")

def clear(self):
    raise TypeError("'ImmutableDict' objects are immutable")

def update(self, *args, **kwargs):
    raise TypeError("'ImmutableDict' objects are immutable")

def setdefault(self, key, default=None):
    raise TypeError("'ImmutableDict' objects are immutable")

이러한 메서드는 dict 클래스의 해당 메서드를 재정의하고 딕셔너리를 수정하려는 시도가 있을 때마다 TypeError 예외를 발생시킵니다.

  1. immutable_dict.py 파일을 저장합니다.
✨ 솔루션 확인 및 연습

ImmutableDict 클래스 테스트

이 단계에서는 ImmutableDict 클래스가 예상대로 작동하는지 테스트합니다. 이 단계를 완료하려면 아래 단계를 따르세요:

  1. /home/labex/project 디렉토리에서 immutable_dict.py 파일을 엽니다.
  2. ImmutableDict 클래스를 테스트하기 위해 파일 끝에 다음 코드를 추가합니다:
if __name__ == "__main__":
    d = ImmutableDict(Connection="kee-alive", Host="www.labex.io")
    print(f'{d["Connection"]=}')
    print(f'{d["Host"]=}')

    try:
        d["Host"] = "test.com"
    except TypeError as e:
        print(repr(e))

    try:
        d.pop("Host")
    except TypeError as e:
        print(repr(e))

    print(f'{d.get("Host")=}')
  1. immutable_dict.py 파일을 저장합니다.
  2. 터미널에서 immutable_dict.py 스크립트를 실행합니다:
python3 immutable_dict.py

출력 결과는 다음과 같아야 합니다:

d["Connection"]='kee-alive'
d["Host"]='www.labex.io'
TypeError("'ImmutableDict' objects are immutable")
TypeError("'ImmutableDict' objects are immutable")
d.get("Host")='www.labex.io'

이 출력 결과는 ImmutableDict 클래스가 예상대로 작동하며, 딕셔너리를 수정하려는 시도가 있을 경우 TypeError 예외가 발생함을 보여줍니다.

축하합니다! ImmutableDict 클래스를 성공적으로 구현하고 테스트했습니다. 이제 Python 애플리케이션에서 이 클래스를 사용하여 불변 데이터 구조를 저장할 수 있습니다.

✨ 솔루션 확인 및 연습

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.