2009-08-11 3 views
2

좋은 일 pythonians,나는 두 가지 주요 기능과 함께 사용자 지정 사전을 만들고 싶어 사용자 지정 사전을

잠금 :

  1. 모든 키 생성에 선언
  2. 그것은 새로운 키를 추가하는 것은 불가능하거나

    : 현재의 것들 (값은 여전히 ​​수정할 수 있습니다)

은 지금 코드가 이것이다 수정

도움을 주시면 감사하겠습니다.

UPD :

솔루션은 하나의 문제가 내가보고 있었는지 동안 :

사전이 오류를 발생 키를 찾는 초기화에 대한 항목과하지를 추가 할 __setitem__를 호출합니다.

cupboard = pick('milk') #raises error 

upd1 :

모든 해결, 대단히 감사합니다.

+0

# 2는 "새 키를 추가 할 수 없습니다 (기존 키는 여전히 수정할 수 있음)", "새 키를 추가하거나 기존 키를 수정할 수 없음"또는 "새 키를 추가 할 수 없거나 현재 값을 수정하십시오 (값은 여전히 ​​수정 가능합니다). " – JAB

+0

아! 어리석은 나, 나는 여기 처음 쓰는 긴장한 약간이었다. 그것은 (값은 여전히 ​​수정 가능합니다) – Rince

답변

12

__setitem__ 메서드를 원하는 동작으로 덮어 쓰려면 dict.__setitem__(self, key, value으로 전화하십시오. 기본 논리를 거치지 않고 기본 사전을 수정하십시오.

class ImmutableDict(dict): 
    def __setitem__(self, key, value): 
     if key not in self: 
      raise KeyError("Immutable dict") 
     dict.__setitem__(self, key, value) 

d = ImmutableDict(foo=1, bar=2) 
d['foo'] = 3 
print(d) 
d['baz'] = 4 # Raises error 

또한 키의 추가를 방지하기 위해 dict.update()setdefault()를 재정의해야합니다. 키 제거를 피하기 위해 dict.__delitem__(), dict.clear(), dict.pop()dict.popitem() 일 수 있습니다.

2

뭔가

class UniqueDict(dict): 
    def __init__(self, *args, **kwargs): 
     dict.__init__(self, *args, **kwargs) 

    def __setitem__(self, name, value): 
     if name not in self: 
      raise KeyError("%s not present") 
     dict.__setitem__(self, name, value) 
2

처럼 난 당신이 아니라 상속보다 위임을 사용하는 것이 좋습니다. 상속을 받으면 이전의 모든 메소드는 상속되지만 예상치 못한 방식으로 동작 할 수 있으므로 클래스에 대한 가정을 망가 뜨리고 자동으로 수행합니다.

위임을 수행하면 제공하는 방법을 완전히 제어 할 수 있으며 구현하지 않은 방법이 필요한 컨텍스트에서 사전을 사용하려고하면 예외가 발생하여 문제가 빨리 해결되지 않습니다.

+0

흥미로운 점을 제기하는 동안, dict는 매우 투명한 클래스이며 키 설정에 대한 모든 가능성을 검증했는지 확인하기가 어렵지 않습니다. 그래서 저는 대표단을 추천하지 않았습니다. –

+0

예. 상속으로 타 버렸다. 이제 나는 매우 조심 스럽다.) –

관련 문제