- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
为了避免在开发过程中重复访问 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/
我正在尝试在 python Google App Engine 应用程序中使用 suds。这是回溯: client = Client(url) File "/base/data/home/apps
我在 Apache 下使用 ssl 提供肥皂服务,没有 ssl 的 suds 效果更好。 我有客户端证书(my.crt 和 user.p12 文件)。 我需要如何配置 suds 客户端以使其与 htt
我正在使用 django 开发一个网络,它处理 wsdl。我有一个处理它的示例代码,但它是用 PHP 编写的,我想为我的 django 将它转换为 python。这是 PHP 文件 ... SOAP
我有以下使用 Suds 的简单 python 测试脚本调用 SOAP 网络服务(该服务是用 ASP.net 编写的): from suds.client import Client url = 'ht
我正在创建一个请求,以在 Django 中使用 SUDS (4.0) 来使用 Web 服务。 然而,Suds 没有放置正确的命名空间。 我得到的肥皂信封:
我是一名优秀的程序员,十分优秀!