2016-06-20 10 views
0

機能のピクルスファイル(defaultDict)の作成方法を教えてください。私が手にエラーが であることはできませんpickle function objectsラムダ関数を使用するdefaultdictをピクルする方法は?

from collections import defaultdict 
dtree = lambda: defaultdict(tree) 

try: import cPickle as pickle 
except: import pickle 

#Create defaultdict object: 
hapPkl = dtree() 

#Create Pickle file 
f = open("hapP.pkl","wb") 
pickle.dump(hapPkl,f) 
f.close() 

のStackTrace:

TypeError         Traceback (most recent call last) 
<ipython-input-287-376cac3b4f0d> in <module>() 
     1 f = open("hapP.pkl","wb") 
----> 2 pickle.dump(hapPkl,f) 
     3 f.close() 

/usr/lib64/python2.7/copy_reg.pyc in _reduce_ex(self, proto) 
    68  else: 
    69   if base is self.__class__: 
---> 70    raise TypeError, "can't pickle %s objects" % base.__name__ 
    71   state = base(self) 
    72  args = (self.__class__, base, state) 

TypeError: can't pickle function objects 
+2

'tree'である場合から来る? 'dtree'だけを定義します。 – user2357112

+0

Python 3では、pickling関数は 'def'ステートメントを使って定義されていれば機能しますが、' lambda'で定義されている場合は機能しません( 'lambda'が変数に割り当てられていても)。 'def dtree()を試してください:return defaultdict(dtree)'おそらく? – Blckknght

+0

@Blckknght Python 2を使用しています。 – Merlin

答えて

1

簡単な回避策がdefaultdictせずに、異なったあなたのツリーデータ構造を実装するために、次のようになります。

class DTree(dict): 
    def __missing__(self, key): 
     value = self[key] = type(self)() 
     return value 

try: import cPickle as pickle 
except: import pickle 

#Create dtree object: 
hapPkl = DTree() 

#Create Pickle file 
f = open("hapP.pkl", "wb") 
pickle.dump(hapPkl, f) 
f.close() 
+0

これのメリットは何ですか? – Merlin

+0

これは、おそらくもっと良い方法です。重要なのは、通常の辞書のように印刷してきれいに印刷する( 'pprint()')ということです。 [[Pythonでネストされた辞書を実装する最も良い方法は?_](http://stackoverflow.com/questions/635483/what-is-the-best-way-to-implement-nested-dictionaries-in-python/19829714#19829714) – martineau

4

cPickleエラーメッセージは少し誤解を招くです。 pickleバージョンが優れています。機能を漬け込むことはできません。彼らは__name__で利用可能にする必要があります。ラムダは__name__'<lambda>'に設定されているので、picklableではありません。 def

def tree(): 
    return defaultdict(tree) 

で定義してください。それはpicklableです。 (あなたがそれをunpickle化するときには、まだ使用可能treeのマッチングの定義が必要です。)

+1

関連情報はこちらhttp://stackoverflow.com/questions/16439301/cant-pickle-defaultdict –

+0

@user、あなたはどういう意味ですか?一致する定義ですか? – Merlin

+0

@Merlin: 'tree'の定義がない環境でこのdefaultdictをunpickleしようとすると、動作しません。 – user2357112

関連する問題