0

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 は Ellipsis オブジェクトではありません。理由はありますか?また、InteractiveInterpreter オブジェクトをピクルする別の方法はありますか?

4

1 に答える 1

1

ストックピクラーではなぜかEllipsis漬けられない。ただし、persistent id機能を使用してこれを実現できます。

まず、 and の代わりにpickle.dumpandオブジェクトpickle.loadを使用する必要がPicklerあります。Unpickler

2 つ目は、2 つの関数を定義する必要があります。1 つ目は、オブジェクトを取得してその ID を返し (またはNone通常の酸洗いの場合)、2 つ目は、ピッキング解除時にこの 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()
于 2012-11-06T18:37:23.830 に答える