gpt4 book ai didi

python - 我怎样才能 pickle 泡沫结果?

转载 作者:太空狗 更新时间:2023-10-29 20:55:04 24 4
gpt4 key购买 nike

为了避免在开发过程中重复访问 SOAP 服务器,我尝试缓存结果,这样我就可以运行其余代码而无需每次都查询服务器。

使用下面的代码我得到一个 PicklingError: Can't pickle <class suds.sudsobject.AdvertiserSearchResponse at 0x03424060>: it's not found as suds.sudsobject.AdvertiserSearchResponse当我尝试 pickle 泡沫结果时。我想这是因为这些类是动态创建的。

import pickle
from suds.client import Client

client = Client(...)
result = client.service.search(...)

file = open('test_pickle.dat', 'wb')
pickle.dump(result, file, -1)
file.close()

如果我放下 -1来自 pickle.dump(result, file, -1) 的协议(protocol)版本,我得到一个不同的错误:

TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled

pickle 是正确的做法吗?我能让它工作吗?有没有更好的办法?

最佳答案

正如您当前收到的错误消息试图告诉您的那样,您正在尝试 pickle 不可 picklable 的实例(在您现在使用的古老的遗留 pickle 协议(protocol)中),因为他们的类定义了 __slots__ 但没有定义 __getstate__ 方法。

但是,即使更改它们的类也无济于事,因为那样您就会遇到其他 问题——您已经正确地确定这可能是由于动态生成的类造成的。所有 pickle 协议(protocol)都“按名称”序列化类(和函数),本质上将它们限制在其模块中的顶级名称。而且,序列化实例绝对确实需要序列化类(如果类不存在,你以后怎么可能重建实例?!)。

因此,您需要以其他方式保存和重新加载数据,从而打破当前对 suds.sudsobject 中具体类的直接依赖,转而依赖接口(interface)(形式化或只是由 duck typing 定义),当您实际上访问 SOAP 服务器时,这些具体类既可以由这些具体类实现,也可以在您从文件加载数据时由更简单的“自制”类实现。 (表示实例状态的数据无疑可以表示为一个字典,所以如果你真的想要的话,你可以通过 pickle 来强制它,例如通过 copy_reg 模块,它允许你为对象定制序列化/反序列化协议(protocol)你被迫非侵入性地治疗[[所以你不能到处添加 __getstate__ 或类似的东西到他们的类]] - 只有当有一个丰富的相互网格时,问题才会出现这些对象之间的引用)。

关于python - 我怎样才能 pickle 泡沫结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2167894/

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