2013-10-31 2 views
1

피클에 문제가 있습니다. 까다로운 사용 사례가 있으며 절인 개체의 사본이 다시 제공되지 않습니다. 내가피클이 내 주장 중 하나를 잃어 버림

class OneArg(object): 
    def __init__(self, somearg, *args, **kwargs): 
     print "In OneArgs's init with args={} and kwargs={}".format(args, kwargs) 
     self._somearg = somearg 
     super(OneArg, self).__init__(*args, **kwargs) 

class OneArgSubclass(OneArg, OrderedDict): 
    def __init__(self, *args, **kwargs): 
     print "In OneArgSubclass's init with args={} and kwargs={}".format(args, kwargs) 
     super(OneArgSubclass, self).__init__(*args, **kwargs) 


def verbose_pickle_dumps (obj): 
    result = pickle.dumps(obj) 
    print result 
    return result 


oas = OneArgSubclass("SOMEARG") 
oas['spam'] = 'eggs' 
oas_red = pickle.loads(verbose_pickle_dumps(oas)) 
print "oas_red.keys():", oas_red.keys() 

로 시작하는 경우 여기에 출력 내가 얻을 수있다 :

In OneArgSubclass's init with args=('SOMEARG',) and kwargs={} 
In OneArgs's init with args=() and kwargs={} 
oas.keys(): ['spam'] 

c__main__ 
OneArgSubclass 
p0 
((lp1 
(lp2 
S'spam' 
p3 
aS'eggs' 
p4 
aatp5 
Rp6 
(dp7 
S'_somearg' 
p8 
S'SOMEARG' 
p9 
sb. 

In OneArgSubclass's init with args=([['spam', 'eggs']],) and kwargs={} 
In OneArgs's init with args=() and kwargs={} 
oas_red.keys(): [] 
내가는 '스팸'OAS 피클 때/'계란'키/값 쌍 거기에 있음을 알 수

하고, _somearg의 가치도 마찬가지입니다. 그러나 "OrderedDict"문자열은 나타나지 않습니다. 피클에서 오아시스를 다시로드하려고하면 'SOMEARG'문자열을 선택하지 않으므로 _somearg의 값으로 사전의 내용이 대신 끝납니다.

나는 보았고 oas에는 __getinitargs __()도 __getnewargs __()도 없습니다. OrderedDict 대신 일반 dict을 사용하면 코드가 작동합니다 (절편 된 표현은 'copy_reg'를 포함하여 상당히 다르게 보입니다). 따라서 피클과 OrderedDict 간의 호환성 문제 일 수 있습니다. 하지만 피클은 OrderedDict와 함께 작업 할 때 잘 작동합니다.

답변

1

피클 할 때 무취시 개체를 다시 만들기 위해 데이터를 추출하는 데 사용할 수있는 several different methods이 있습니다. 당신이에 실행하는 문제는 OrderedDict 그들 (__reduce__) 중 하나를 정의하지만, 무엇을 반환하는 것은 당신의 __init__와 호환되지 않는 것입니다 - 그래서 당신은 자신의 당신 작성해야 :

def __reduce__(self): 
    return (self.__class__, (self._somearg, tuple(self.items()))) 
0

당신은 할 수 있습니다 클래스에 __repr__() 메소드를 구현하려면 다음과 같이하십시오 : http://bytes.com/topic/python/answers/781057-pickle-instance-custom-class.

는 예를 들어, 그들은 OrderedDict에서 클래스를 파생하고, 클래스 __init()__

class OrderedDict(dict): 

    def __init__(self, d = None): 
     self._keys = [] 
     if d == None: d = {} 
     self.update(d) 
을 의미 할 때 __repr__() 방법이 방법

def __repr__(self): 
     return '{%s}' % ', '.join([': '.join([repr(k),str(v)]) \ 
            for k,v in zip(self.keys(), self.values())]) 

를 구현

관련 문제