2015-09-23 54 views
2

我正在将一些代码从Python 转换为Python ,而且我很苦恼有一个泡菜问题!这里是什么,我试图做一个简单的例子:Python 3的Pickle错误

class test(str): 

     def __new__(self, value, a): 
       return (str.__new__(self, value)) 

     def __init__(self, value, a): 
       self.a = a 


if __name__ == '__main__': 
     import pickle 
     t = test("abs", 5) 
     print (t) 
     print(t.a) 

     wdfh = open("./test.dump", "wb") 
     pickle.dump(t, wdfh) 
     wdfh.close() 

     awfh = open("./test.dump", "rb") 
     newt = pickle.load(awfh) 
     awfh.close() 

     print (t) 
     print (newt.a) 

这个工程只是与Python 2不错,但我有与Python 3以下错误:

Traceback (most recent call last):

File "test.py", line 21, in

newt = pickle.load(awfh) 

TypeError: new() takes exactly 3 arguments (2 given)

我不明白是什么是不同的,有什么想法?

+0

您可以包括整个堆栈跟踪? –

+0

你正在阅读蟒蛇3蟒蛇2腌制的东西吗?它们不兼容。 –

+0

不!该脚本在Python3或Python2中执行,因此读/写操作在同一版本中完成。 – user1595929

回答

2

这里的问题是,你的代码只能与协议0或1默认情况下工作,Python的2使用协议0,而Python 3中使用的协议3.

对于协议2及以上的,你不能有额外的除非您实施__getnewargs__方法,否则您可以使用__new__方法的参数。

在这种情况下,简单地增加:

def __getnewargs__(self): 
     return (str(self),self.a) 

应该做的伎俩。

或者你可以用协议0或1,坚持和改变转储电话:

pickle.dump(t, wdfh, 0) 
+0

谢谢你的完美! – user1595929

+0

@ user1595929如果您认为这是最佳解决方案并正确回答您的原始问题,请检查它是否被接受。 – strubbly