Как я могу засолить результаты пены?

Чтобы неоднократно стараться не получать доступ к серверу 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

Действительно ли соление является правильным поступком? Я могу заставить его работать? Существует ли лучший путь?

8
задан Mat 30 January 2010 в 16:04
поделиться

2 ответа

Как сообщение об ошибке, которое вы в настоящее время пытаетесь сказать вам, вы пытаетесь раскрутить экземпляры не Prokleable (в древнем наследие протокол сортировки, который вы сейчас используете), потому что их Класс определяет __ Слоты __ , но не __ getState __ метод.

Тем не менее, даже изменение их класса не поможет, потому что тогда вы бы столкнулись с проблемой , - которую вы уже правильно идентифицированы как вероятность из-за динамически сгенерированных классов. Все Protocols Протоколы Serialize Классы (и функции) «По имени», по сути, ограничивая их на названиях верхнего уровня в их модулях. И, сериализация экземпляра абсолютно требует сериализации класса (как еще вы могли бы восстановить экземпляр позже, если у класса не было рядом?!).

Итак, вам нужно будет сохранить и перезагружать данные каким-то другим способом, нарушая текущую прямую зависимость от конкретных классов в SUDS.SudsObject в пользу в зависимости от интерфейса (либо формализованного или только что определено По утиной печати), которые могут быть реализованы как такими конкретными классами, когда вы на самом деле получаете доступ к серверу SOAP или проще «домашние», когда вы загружаете данные из файла. (Данные, представляющие состояние экземпляра, несомненно, могут быть представлены в виде Dict, поэтому вы можете заставить его через сортировку, если вы действительно хотите, например, через модуль Copy_reg , который позволяет настроить протоколы сериала / десериализования для объектов, которые Вы вынуждены лечить неинвазиптирующие [[так, что вы не можете пойти вокруг добавления __ GUTSTATE __ или тому подобное к своим классам]] - проблема придет только в том случае, если есть богатая сетка взаимных ссылок между такие объекты).

8
ответ дан 5 December 2019 в 17:37
поделиться

Вы выбираете сам объект класса, а не объекты экземпляра класса. Это не будет работать, если объект класса воссоздан. Однако экземпляры маринований класса будут работать до тех пор, пока существует объект класса.

2
ответ дан 5 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: