고정 키 집합을 가지는 딕셔너리 (FixedKeysDict)
이 예제에서는 초기화 시 정의된 키 집합 외에는 새로운 키를 추가할 수 없도록 제한하는 딕셔너리 클래스를 구현합니다.
코드 설명
- __init__: 초기 키 집합을 정의하고, 초기 데이터가 이 키 집합에 속하는지 확인합니다.
- __setitem__: 새로운 키를 추가하려 할 때 제한을 걸어 기존 키에 대해서만 값을 설정할 수 있도록 합니다.
- update: update 메서드를 오버라이드하여 새로운 키의 추가를 방지합니다.
- __repr__: 딕셔너리의 문자열 표현을 사용자 정의합니다.
class FixedKeysDict(dict):
def __init__(self, *args, **kwargs):
"""
초기 키 집합을 정의합니다.
"""
# 초기 데이터 로드
super().__init__(*args, **kwargs)
# 초기 키 집합 저장
self._fixed_keys = set(self.keys())
def __setitem__(self, key, value):
if key not in self._fixed_keys:
raise KeyError(f"Cannot add new key '{key}'. Allowed keys: {self._fixed_keys}")
super().__setitem__(key, value)
def update(self, *args, **kwargs):
"""
update 메서드도 새로운 키의 추가를 제한합니다.
"""
if args:
if isinstance(args[0], dict):
for key in args[0]:
if key not in self._fixed_keys:
raise KeyError(f"Cannot add new key '{key}'. Allowed keys: {self._fixed_keys}")
elif isinstance(args[0], (list, tuple)):
for key, _ in args[0]:
if key not in self._fixed_keys:
raise KeyError(f"Cannot add new key '{key}'. Allowed keys: {self._fixed_keys}")
else:
raise TypeError("Invalid argument type for update")
for key in kwargs:
if key not in self._fixed_keys:
raise KeyError(f"Cannot add new key '{key}'. Allowed keys: {self._fixed_keys}")
super().update(*args, **kwargs)
def __repr__(self):
return f"{self.__class__.__name__}({dict.__repr__(self)})"
# 사용 예제
try:
# 고정 키 'a', 'b'로 초기화
my_dict = FixedKeysDict(a=1, b=2)
print(my_dict) # 출력: FixedKeysDict({'a': 1, 'b': 2})
# 기존 키 수정
my_dict['a'] = 10
print(my_dict) # 출력: FixedKeysDict({'a': 10, 'b': 2})
# 새로운 키 추가 시도
my_dict['c'] = 3 # KeyError 발생
except KeyError as e:
print(e) # 출력: Cannot add new key 'c'. Allowed keys: {'a', 'b'}
try:
# update 메서드로 새로운 키 추가 시도
my_dict.update({'a': 100, 'c': 300}) # KeyError 발생
except KeyError as e:
print(e) # 출력: Cannot add new key 'c'. Allowed keys: {'a', 'b'}
출력 결과
FixedKeysDict({'a': 1, 'b': 2})
FixedKeysDict({'a': 10, 'b': 2})
"Cannot add new key 'c'. Allowed keys: {'a', 'b'}"
"Cannot add new key 'c'. Allowed keys: {'a', 'b'}"
'실용적인 코드 샘플' 카테고리의 다른 글
[실용적인 코드 샘플] 제너릭을 이용한 `Triple` 자료구조 1 (2) | 2024.10.16 |
---|---|
[실용적인 코드 샘플] 특정 키와 값의 타입을 제한하는 딕셔너리 (TypedDict) (2) | 2024.10.16 |
[실용적인 코드 샘플] 최대 크기를 가지는 딕셔너리 (`LimitedSizeDict`) (0) | 2024.10.16 |
[실용적인 코드 샘플] 읽기 전용 딕셔너리(ReadOnlyDict) (2) | 2024.10.16 |
[실용적인 코드 샘플] 제너릭을 이용한 `Pair` 클래스 1 (0) | 2024.10.15 |