2012-11-16 6 views
0

여기에 나의 첫 번째 질문을 할 시간입니다. 나는 다음 문제를 직면하고있다 :값이 사전 정의 된 피클

나는 pickle 모듈을 사용하여 큰 사전을 덤프 한 다음 디스크에서 다시로드한다. 문제는 unpickle 처리 후 두 객체가 같지 않다는 것입니다. 사실 이것은 내가하고있는 일이다.

파일에서 A.py 나는 몇 가지 속성과 메소드를 가진 클래스를 정의한다. 값이

A.py의 클래스의 인스턴스 인 경우

파일 B.py에서 나는 또한 파일 B.py에 나는이 사전을 피클 다시 unpickle 사전을합니다.

두 개의 dict은 동일하지 않습니다. 나는 열쇠를 확인하고 동일하다. 문제는 값에 달려 있습니다.

아이디어가 있으십니까? 같은 키

+6

인스턴스는 일반적으로 picklable이므로 일부 코드 예제 또는 사용자가 입력 한 내용과 벗어나는 내용을 보여주는 예제가 필요합니다. –

+4

* 두 개의 딕트는 동일하지 않습니다. * - "같은"측정은? 그들은 동일한 정체성을 가지지 않을 것입니다. 커스텀 클래스는'__eq__' 메소드를 가지고 있습니까? – MattH

답변

2

두 개의 서로 다른 사전은 & 값이 동일한 것으로 간주되지 않을 것이다 :

>>> d1 = {'k1': 12345} 
>>> d2 = {'k1': 12345} 
>>> d1 is d2 
False 
>>> d1['k1'] is d2['k1'] 
False 

을 실제로 하나에서 다른 값을 복사하더라도 : 각각 때문이다

>>> d1['k1'] = d2['k1'] 
>>> d1['k1'] is d2['k1'] 
True 
>>> d1 is d2 
False 

별도의 컨테이너입니다.

(set(d1) == set(d2)) and all(d1[k] == d2[k] for k in d1) 

첫 번째 하위 표현식은 각각 같은 값으로 키가 확인합니다 : 모든 키와 값이 같은 표현을 사용 동일 값보다는 문자 그대로있는 동일한 개체가있는 경우에 다른 한편으로는, 당신은 확인할 수 있습니다 두 번째 키는 각각의 키와 연관된 값이 동일한 것입니다.

저장된 데이터에서 사전을 다시 구성하면 새 데이터가 만들어집니다. 같은 사전은 아니지만 모든 키와 값은 원본과 동일해야합니다. 이것이 사실이 아니라면 적어도 동일한 코드가 아닌 코드인지 확인하십시오. 나는 그것의 값이이 클래스를 기반으로 사전을 만들

class SchemaObject: 
def __init__(self): 
    self.type = '' 
    self.name = '' 
    self.parentdn = '' 
    self.dn = '' 
    self.oclass = '' 

def initWithXMLNode(self, xmlnode, parentdn): 
    self.type = '' 
    self.name = '' 
    self.parentdn = parentdn 
    if xmlnode.nodeName=='fragments': 
     self.dn = parentdn 
    if xmlnode.nodeName=='fragment': 
     self.initFragment(xmlnode) 
    elif xmlnode.nodeName=='configGroupLdap': 
     self.initGroup(xmlnode) 
    elif xmlnode.nodeName=='configObjectLdap': 
     self.initObject(xmlnode) 

def initWithFragment(self, dn, parentdn, name): 
    self.type = 'object' 
    self.name = name 
    self.parentdn = parentdn 
    self.dn = dn 
    self.oclass = name 

def initFragment(self, xmlnode): 
    self.type = 'fragment' 
    self.dn = 'fsFragmentId=' + xmlnode.firstChild.nodeValue + ',' + self.parentdn 
    self.oclass = 'FSFragment' 

def initGroup(self, xmlnode): 
    self.type = 'group' 
    self.name = 'group-' + xmlnode.getAttribute('name') 
    self.dn = xmlnode.getAttribute('dn') 
    self.oclass = 'FSFragment' 

def initObject(self, xmlnode): 
    self.type = 'object' 
    self.name = xmlnode.getAttribute('name') 
    self.oclass = self.name 
    if not xmlnode.hasAttribute('rdnname'): 
     self.type = 'no_rdnname' 
     return 
    else: 
     rdnname = xmlnode.getAttribute('rdnname') 
    parts = rdnname.split(',') 
    if xmlnode.getAttribute('multiple')!='true': 
     dn = self.parentdn 
     for part in reversed(parts): 
      dn = 'fsFragmentId=' + part + ',' + dn 
     self.dn = dn 
    else: 
     self.type = '' 
     self.dn = 'fsFragmentId=' + parts[len(parts)-1] + ',' + self.parentdn 
     dynamicStatics.append(self.oclass) 

및 파일 B.py에 :처럼 실제로 사전의 값입니다 클래스의

0

인스턴스 보인다. dict은 my_dict입니다. 그리고 키가 동일하다는 것도 확인했습니다. 이 사전 사이의 두 값을 비교하려고 할 때만 실패합니다.

그래서 난 그것을 피클하려고 :

with open('my_dumped.pkl','wb') as schema: 
    pickle.dump(my_dict,schema) 

때 디스크에서 복원을 시도 :

with open('my_dumped.pkl','rb') as schema: 
    b = pickle.load(schema) 

내가 my_dumped 교부 해주기 경우 == B는해야하지이 반환 사실? 나는 정체성을 좋아하지 않아. 평등을 위해서. 마티 아누가 말했듯이 열쇠가 모두 있고, 각 열쇠가 올바른 가치를 지녔다고.

위의 동등성은 불행히도 False를 반환합니다.