2017-01-30 2 views
3

키가 1-1 일 때 간단한 매핑 클래스를 만들려고합니다. key1:key2, key2:key1. 클래스가 입력 한 값과 같은지 확인하려고 할 때 오류가 발생합니다. True을 가져야하지만 False이 계속 나타납니다.dictonary 클래스 "매핑"오류가 발생했습니다.

>>> m=Mapping() 
>>> m[2]=3 
>>> m 
Mapping({2: 3, 3: 2}) 
>>> m==Mapping({2: 3, 3: 2}) 
False 

내가 뭘 잘못하고 있는지 잘 모르겠다. 내 코드는 아래에있다.

class Mapping(): 
    def __init__(self, dic={}): 
     self.Dict = dict(dic) 
    def __repr__(self): 
     return "Mapping({})".format(self.Dict) 
    def __getitem__(self, loc=0): 
     return self.Dict[loc] 
    def pop(self, popn=0): 
     popm = self.Dict[popn] 
     self.Dict.pop(popn, None) 
     self.Dict.pop(popm, None) 
    def __setitem__(self, x, y): 
     self.Dict[x]=y 
     self.Dict[y]=x 
+9

'__eq__'을 구현하면 ... –

+0

기본 dict와 기능상의 차이점이 없습니다. '__eq__ '마법 방법을 정의하는 것이 도움이되지만, 왜 사전을 기반으로 사전을 다시 구현하려고합니까? –

+1

@NikolayProkopyev 그의 dict는 자동으로 역 매핑을 제공합니다. – Max

답변

6

귀하의 Mapping 클래스는 제대로 작동하려면 ==에 대한 위해 __eq__ 매직 메소드를 구현해야한다. Dict가 동일한 경우 두 Mappings이 동일하다고 가정하면,이 같은 somehting을 시도 할 수 있습니다 :이없이

def __eq__(self, other): 
     if isinstance(other, Mapping): 
      return self.Dict == other.Dict 
     return False 

, ==을 사람들은 is가하는 일, 즉 동일한 인스턴스를 여부를 확인로 다시 떨어질 것이다.


종종, 당신은 __eq__ 구현할 때, 당신은 또한 __hash__ 방법을 구현하는 것이, 그래서 두 사람은 일치한다. 당신은 예를 들어, 수, __hash__없이

def __hash__(self): 
     return hash(frozenset(self.Dict.items())) 

: 다시 말하지만, 당신은 단순히 해시에 대한 self.Dict에 위임 할 수 있지만 dict는 해쉬되지 않습니다 (이유를 들어, 아래 참조),하지만 당신은 항목을 해시 수 Mapping 클래스를 다른 사전의 키로 사용하지 마십시오. 그러나 dict이 변경 가능하므로이 설정은 문제가 될 수 있으므로 나중에 hash(m)이 변경되어 dict 또는 set에서 Mapping을 검색 할 수 없게됩니다.

+1

이 경우에는'__hash__'도 구현해야합니다. 맞습니까? – Tagc

+0

@tobias_k, 왜 '__hash__'이 필요한지 설명해 주시겠습니까? –

+2

@NikolayProkopyev 내 편집을 참조하십시오. 그러나,이 특별한 경우에는 '__hash__'을 구현하는 것이 실제로 "정상적인"변경 가능한'dict'처럼 말이되지 않습니다. –

관련 문제