4

跑步:

import pickle

class Foo(str):
    def __new__(cls, s, bar):
        self = super(Foo, cls).__new__(cls, s)
        self.bar = bar
        return self

with open('foo.pkl', 'wb') as w:
    x = pickle.dump(Foo('', 1), w, pickle.HIGHEST_PROTOCOL)

with open('foo.pkl', 'rb') as w:
    x = pickle.load(w)

导致此异常:

Traceback (most recent call last):
  File "pkl.py", line 13, in <module>
    x = pickle.load(w)
  File "/usr/lib/python2.7/pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "/usr/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 1083, in load_newobj
    obj = cls.__new__(cls, *args)
TypeError: __new__() takes exactly 3 arguments (2 given)

如果我删除它,它会起作用,pickle.HIGHEST_PROTOCOL但如果可能的话,我宁愿使用新协议。

我只是没有得到泡菜协议描述。谁能帮我吗?一定有什么神奇的方法……

4

1 回答 1

5

这在没有 的情况下有效,HIGHEST_PROTOCOL因为旧协议不使用__new__构造函数来处理未腌制的对象。

但基本情况是您在str__new__. pickle模块和内置类型对此str一无所知,它将导致显示的错误。

要修复它,您应该定义__getnewargs__方法并返回(self.__class__, self.bar)足以让它再次工作。

关于模块使用的特殊方法的文档pickle可以在这里找到

于 2013-01-10T00:05:51.060 回答