collections.OrderedDict 標準クラスのサブクラスを作成しました。このクラスのオブジェクトを unpickle しようとすると、次のエラーが発生します。
Traceback (most recent call last):
File "pickle.py", line 29, in <module>
print cPickle.load(f)
TypeError: ('__init__() takes exactly 1 argument (2 given)', <class '__main__.ConfiguratorsDict'>, ([['toto', 20]],))
このような動作の理由を理解しようとして、collections.OrderedDict の本体を絞り込んで、次の最小限のコードを取得し、説明済みのエラーをトリガーしました。ここにあります:
import cPickle
class OrderedDict(dict):
def __reduce__(self):
items = [[k, self[k]] for k in self]
inst_dict = vars(self).copy()
for k in vars(OrderedDict()):
inst_dict.pop(k, None)
if inst_dict:
return (self.__class__, (items,), inst_dict)
return self.__class__, (items,)
class ConfiguratorsDict(OrderedDict):
def __init__(self):
OrderedDict.__init__(self)
self._myspec = "blabla"
if __name__ == "__main__":
f = open("test.pickle","wb")
c = ConfiguratorsDict()
c["toto"] = 20
cPickle.dump(c,f)
f.close()
f = open("test.pickle","rb")
print cPickle.load(f)
f.close()
この時点で、何がうまくいかないのか本当にわかりません。pickle メカニズムで誤解していることはありますか、それとも OrderedDict に関連する問題がありますか?
助けてくれてどうもありがとう