Чтобы неоднократно стараться не получать доступ к серверу SOAP во время разработки, я пытаюсь кэшировать результаты, таким образом, я могу выполнить остальную часть моего кода, не запрашивая сервер каждый раз.
С кодом ниже я получаю a PicklingError: Can't pickle <class suds.sudsobject.AdvertiserSearchResponse at 0x03424060>: it's not found as 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()
Если я отбрасываю -1
версия протокола от pickle.dump(result, file, -1)
, Я получаю другую ошибку:
TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled
Действительно ли соление является правильным поступком? Я могу заставить его работать? Существует ли лучший путь?
Как сообщение об ошибке, которое вы в настоящее время пытаетесь сказать вам, вы пытаетесь раскрутить экземпляры не Prokleable (в древнем наследие протокол сортировки, который вы сейчас используете), потому что их Класс определяет __ Слоты __
, но не __ getState __
метод.
Тем не менее, даже изменение их класса не поможет, потому что тогда вы бы столкнулись с проблемой , - которую вы уже правильно идентифицированы как вероятность из-за динамически сгенерированных классов. Все Protocols
Протоколы Serialize Классы (и функции) «По имени», по сути, ограничивая их на названиях верхнего уровня в их модулях. И, сериализация экземпляра абсолютно требует сериализации класса (как еще вы могли бы восстановить экземпляр позже, если у класса не было рядом?!).
Итак, вам нужно будет сохранить и перезагружать данные каким-то другим способом, нарушая текущую прямую зависимость от конкретных классов в SUDS.SudsObject
в пользу в зависимости от интерфейса (либо формализованного или только что определено По утиной печати), которые могут быть реализованы как такими конкретными классами, когда вы на самом деле получаете доступ к серверу SOAP или проще «домашние», когда вы загружаете данные из файла. (Данные, представляющие состояние экземпляра, несомненно, могут быть представлены в виде Dict, поэтому вы можете заставить его через сортировку, если вы действительно хотите, например, через модуль Copy_reg
, который позволяет настроить протоколы сериала / десериализования для объектов, которые Вы вынуждены лечить неинвазиптирующие [[так, что вы не можете пойти вокруг добавления __ GUTSTATE __
или тому подобное к своим классам]] - проблема придет только в том случае, если есть богатая сетка взаимных ссылок между такие объекты).
Вы выбираете сам объект класса, а не объекты экземпляра класса. Это не будет работать, если объект класса воссоздан. Однако экземпляры маринований класса будут работать до тех пор, пока существует объект класса.