我想持久保留reverend.thomas.Bayes
中的對象。當然,如果我嘗試直接醃製這些類中的一個,我得到:如何在不修改原始類的情況下刪除instancemethod對象,但不修改原始類
TypeError: can't pickle instancemethod objects
要解決這個問題,我已經試過聲明兩個功能:
import types
from itertools import chain
from copy import copy
from reverend.thomas import Bayes
def prepare_bayes_for_pickle(bayes_obj):
dic = copy(bayes_obj.__dict__) #I also tried using deepcopy instead of copy
for k in dic:
if type(k) == types.MethodType:
dic.pop(k)
return dic
def reconstruct_bayes_from_pickle(bayes_dic):
b = Bayes()
# Merge b with bayes_dic, with bayes_dic taking precedence
dic = dict(chain(bayes_dic, b))
b.__dict__ = dic
return b
基本上,我嘗試複製對象的__dict__
,並嘗試通過測試types.MethodType
的類型來刪除instancemethod
。
然後我會通過創建一個新Bayes
對象,然後bayes_dic
合併回來在一起(在它是拆封。)
但是,我還沒有起牀第二種方法又重建對象,因爲我仍然無法醃製從prepare_bayes_for_pickle
返回的對象,但未收到原始錯誤。
可能重複的[如何醃一個scipy.stats分發(不能pickle instancemethod對象)](http://stackoverflow.com/questions/14235693/how-to-pickle-a-scipy-stats-distribution -cant-pickle-instancemethod-objects) – Bakuriu 2013-03-19 12:25:45
但是,對所謂重複的答案只涉及對參數進行酸洗。我不認爲這對我有用,因爲我會對這個對象進行很多變種:取消所有的變異參數並且每次創建一個新對象意味着每次對象被「取消選中」時都必須重複計算。 – dg123 2013-03-19 13:18:16
與其他幾乎所有的操作相比,您是否考慮過酸洗/取出文件佔用大量時間?我的意思是,即使重複計算也不是瓶頸。你應該在做出這種表述之前進行配置另外,最重要的是,我看到'Bayes'類具有'save'和'load'方法。你爲什麼不使用它們? – Bakuriu 2013-03-19 16:02:34