Python 我如何腌制肥皂水?

Python 我如何腌制肥皂水?,python,soap,pickle,suds,Python,Soap,Pickle,Suds,为了避免在开发过程中重复访问SOAP服务器,我尝试缓存结果,这样我就可以运行其余代码,而无需每次查询服务器 使用下面的代码,当我尝试pickle一个suds结果时,我会得到一个PicklingError:Can't pickle:它没有作为suds.sudsobject.AdvertiserSearchResponse找到。我想这是因为类是动态创建的 import pickle from suds.client import Client client = Client(...) result

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

使用下面的代码,当我尝试pickle一个suds结果时,我会得到一个
PicklingError:Can't pickle:它没有作为suds.sudsobject.AdvertiserSearchResponse找到。我想这是因为类是动态创建的

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()
如果我从pickle.dump(result,file,-1)
中删除
-1
协议版本,我会得到一个不同的错误:

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

酸洗是正确的做法吗?我能让它工作吗?有更好的方法吗?

您正在清除类对象本身,而不是类的实例对象。如果重新创建类对象,这将不起作用。但是,只要类对象存在,类的pickle实例就可以工作。

由于当前收到的错误消息试图告诉您,您正在尝试pickle不可pickle的实例(在您现在使用的古老的遗留pickle协议中)因为他们的类定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法,而不是
\uuuuuuuuuuuuuuuuuuuGetState\uuuuuuuuuuuuu

然而,即使修改它们的类也不会有帮助,因为这样您就会遇到另一个问题——您已经正确地确定这可能是由于动态生成的类造成的。所有的
pickle
协议都“按名称”序列化类(和函数),本质上是将它们限制在模块中的顶级名称。而且,序列化一个实例绝对是否需要序列化该类(如果该类不存在,您以后如何重建实例?!)


因此,您需要以其他方式保存和重新加载数据,打破当前对
suds.sudsobject
中具体类的直接依赖,转而依赖一个接口(形式化的或仅由duck类型定义的),当您实际访问SOAP服务器时,该接口可以由这两个具体类实现,或者在从文件加载数据时使用更简单的“自制”方法。(毫无疑问,代表实例状态的数据可以表示为dict,因此如果确实需要,您可以通过pickle强制它,例如通过
copy\u reg
模块,该模块允许您为被迫非侵入性处理的对象自定义序列化/反序列化协议[[所以你不能到处给他们的类添加
\uuuu getstate\uuuu
或类似的东西]]——只有当这些对象之间有丰富的相互引用时,问题才会出现。)

我想我明白你的意思,但是检查后,键入(结果)是和结果。uuu类uuuu那么我不是在尝试pickle实例吗?从粘贴的代码来看,你似乎在pickle实例,但你所指的错误表明你在pickle类。好吧,我不是完全疯了:)如果我删除最新协议的-1,我会得到一个不同的错误,我会修改问题以包括see I有没有办法获得动态创建的类的定义,以便将其保存到文件中,然后用作普通类?