2012-11-06 3 views
0

이상한 InteractiveInterpreter 내가 알고있는 내용에 따라 생략 객체가 없습니다 다음 오류InteractiveInterpreter의 인스턴스를 왜 picke 할 수 없습니까?

 

    File "", line 1, in 
    File "/usr/lib/python2.7/pickle.py", line 224, in dump 
    self.save(obj) 
    File "/usr/lib/python2.7/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.7/pickle.py", line 725, in save_inst 
    save(stuff) 
    File "/usr/lib/python2.7/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.7/pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "/usr/lib/python2.7/pickle.py", line 663, in _batch_setitems 
    save(v) 
    File "/usr/lib/python2.7/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.7/pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "/usr/lib/python2.7/pickle.py", line 663, in _batch_setitems 
    save(v) 
    File "/usr/lib/python2.7/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.7/pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "/usr/lib/python2.7/pickle.py", line 663, in _batch_setitems 
    save(v) 
    File "/usr/lib/python2.7/pickle.py", line 306, in save 
    rv = reduce(self.proto) 
    File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex 
    raise TypeError, "can't pickle %s objects" % base.__name__ 
TypeError: can't pickle ellipsis objects 
 

에 InteractiveInterpreter 결과의 인스턴스를 피클하려는 시도. 어떤 이유? InteractiveInterpreter 객체를 피클 링하는 다른 방법이 있습니까?

+0

은 아마도'InteractiveInterpreter' 인스턴스의 자식 개체입니다. 피클하면 뭔가 재귀 적으로 절인됩니다. –

+0

당신은'__set/getstate__'를 가지고 그것들을 처리 할 수 ​​있습니다. – lolopop

+0

그건 그렇고'Ellipsis'는 picklable이 아니라는 것이 이상합니다 ... 그것은'None'과 같은 단순한 것입니다. – Bakuriu

답변

1

어떤 이유에서 Ellipsis은 주식 pickler에서 절이 수 없습니다. 그러나 이것을 실현하기 위해 persistent id 기능을 사용할 수 있습니다.

먼저 pickle.dumppickle.load 대신 PicklerUnpickler 개체를 사용해야합니다.

두 번째로 먼저 두 개의 함수를 정의해야합니다. 첫 번째는 객체를 가져 와서 id (또는 일반 pickling의 경우 None)를 반환하고 두 번째는 unpickling 할 때이 ID를 객체로 변환합니다.

근무 예 :

import cPickle as pickle 

def dump_ellipsis(obj): 
    if obj is Ellipsis: 
     return "Ellipsis" 

def load_ellipsis(persid): 
    if persid == "Ellipsis": 
     return Ellipsis 


storage = open("tmp.pkl", "w") 

pickler = pickle.Pickler(storage) 

pickler.persistent_id = dump_ellipsis 

pickler.dump(Ellipsis) 

storage.close() 

storage = open("tmp.pkl") 

unpickler = pickle.Unpickler(storage) 

unpickler.persistent_load = load_ellipsis 

print unpickler.load() 
관련 문제