gpt4 book ai didi

python - Python 3 的 Pickle 错误

转载 作者:行者123 更新时间:2023-11-30 23:06:17 29 4
gpt4 key购买 nike

我正在将一些代码从 Python 2 转换为 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)

我不明白有什么区别,有什么想法吗?

最佳答案

这里的问题是您的代码仅适用于协议(protocol) 0 或 1。默认情况下,Python 2 使用协议(protocol) 0,而 Python 3 使用协议(protocol) 3。

对于协议(protocol) 2 及以上协议(protocol),除非实现 __getnewargs__ 方法,否则不能向 __new__ 方法提供其他参数。

在本例中只需添加:

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

应该可以解决问题。

或者您可以坚持使用协议(protocol) 0 或 1 并更改转储调用:

    pickle.dump(t, wdfh, 0)

关于python - Python 3 的 Pickle 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32735490/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com