Python:pickle派生的str对象

Dav*_*ter 4 python string cpython pickle

运行:

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)
Run Code Online (Sandbox Code Playgroud)

此例外的结果:

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)
Run Code Online (Sandbox Code Playgroud)

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

我只是没有得到pickle协议描述.谁能帮我吗?魔术方法必须有一些方法......

Wes*_*sie 5

这样做没有,HIGHEST_PROTOCOL因为较旧的协议不使用__new__构造函数来处理unpickled对象.

但基本的是,str在添加新参数时,您正在使用序列化方法__new__.该pickle模块也没有内建str类型具有这样的任何知识,这将导致所显示的错误.

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

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