2012-11-06 46 views
0

嘗試鹹菜InteractiveInterpreter結果的一個實例,在下面的錯誤爲什麼我們不能拍攝InteractiveInterpreter的實例?

 

    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不是根據我所知道的省略號對象。有什麼理由?是否有任何替代方法來pickle InteractiveInterpreter對象?

+0

想必'InteractiveInterpreter'實例的子對象。當你醃製東西時,遞歸地醃製。 –

+0

你可以嘗試用'__set/getstate__'來處理它們。 – lolopop

+0

順便說一句,奇怪的是'省略號'是不可挑選的...它只是一個像'None'的單身人士,在酸洗它時我沒有看到任何問題。 – Bakuriu

回答

1

由於某種原因,Ellipsis不能在pickler中醃製。但您可以使用persistent id功能來實現此目的。

首先,您應該使用PicklerUnpickler對象,而不是pickle.dumppickle.load。第二,你必須定義兩個函數 - 第一個將獲取一個對象並返回它的id(或者None用於定期酸洗),第二個將在取消打印時將該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() 
相關問題