2017-12-30 10 views
1

これは私が先に尋ねた質問へのフォローアップです:under class wrappersの辞書をピクルしたいが、クラスラッパーモジュールをロードできませんでした。関数の辞書を含むpickled(dill)ファイルを読み込んでいます

解決このpickleの代わりにdillを使用しているので、私は持っている:

func_dict = lowess_record() 

wanted = ['func_dict', 'Interp1dPicklable', 'PolyValPicklable', 'dill', '__builtins__', 'wanted'] 

for name in globals().keys(): 
    if name not in wanted: 
     del globals()[name] 

del globals().wanted 

with open('./func_dict.p', 'wb') as f: 
    dill.dump(globals(), f) 

は、私は私だけで動作するように望んでいたとして、彼らは必要ありませんし、globals()から(データからfunc_dictの作成に関連する)いくつかの不要な変数を削除func_dict。

は今、私が使用して漬けファイルをロードするとき:

func_dict_loaded = dill.load(open("./func_dict.p", "rb")) 

私が手:

<In> func_dict_loaded.keys() 

<Out> ['_dh', '__', 'dill', '_15', '__builtin__', '_i32', '_30', '_16', '_i15', quit', '_34', '_i11', '_i9', '_i8', '_i7', '_i6', '_i5', '_i4', '_i3', '_i2', _i1', '__package__', 'exit', 'get_ipython', '_i', '_i29', '_i26', '_i17', _i24', _i14', '_i22', '__doc__', '_i20', '_i16', '_i21', '_18', '_11', '_i34', __builtins__', '_ih', '_i28', 'sys', '_20', '_i27', '__name__', '___', '_i33', _', '_sh', '_i25', '_29', '_32', '_22', 'func_dict_loaded', '_i23', '_i13', _i12', '_iii', '_i10', '_13', '_12', '_ii', 'In', '_i31', '_i30', '_i19', _i18', _i35', '_oh', 'Out'] 

機能の辞書にアクセスする方法はありませんで!意図する出力を得るためには何が必要ですか?

+0

新しいユーザーのための素晴らしい投稿です! –

+0

ありがとうございました@иσαнcяişтiпσ! – MoMiJi

答えて

0

は、私はここだ、それを固定しているように見える方法:

の代わりに、関数の辞書をダンプ:私が使用している

dill.dump(globals(), f) 

dill.settings['recurse'] = True 

with open('./Data/function_dict.p', 'wb') as f: 
    dill.dump([dill, interp1d, Interp1dPicklable, PolyValPicklable, func_dict], f) 
f.close() 

最初の行があります私が見つけたチップhere

次に、.pファイル私が呼ん:

dill.settings['recurse'] = True 

func_dict_loaded = dill.load(open("./Data/function_dict.p", "rb")) 

(わからない最初の行がそこに必要とされているが、どんな害を及ぼすとは思われない場合。)その後

func_dict_loaded[-1] 

返しfunc_dict(ダンピング時のリストの注記)。

私は、変数xためfunc_1の結果を返すために

func_dict_loaded[-1]['func1'](x) 

を使用することができます。

私はこれを見て、コメントしたり答えたりした皆さんのおかげで、これは将来このような問題を抱える人に役立つことを願っています!

0

多分私はここに何かが不足しているかもしれませんが、私は関数がfunc_dict_loaded.items()であると期待しています、そして_i7を呼び出す場合はfunc_dict_loaded['_i7']()を実行します。

私は問題を再現しようとしましたが、globals()の操作は避けました。それは安全なことではありません。あなたは機能のdictを作るためにそれを行う必要はありません、あなたは自分で作成することができます。

ので、1つのセッションで:

>>> import dill 
>>> def myfunc(): 
     print("Hello world") 
>>> mydict = {"myfunc": myfunc} 
>>> with open (r"C:\..etc..\Temp\dict.p","wb") as f: 
     dill.dump(mydict,f) 

、別のセッションで:あなたが見ることができるように

>>> import dill 
>>> mydict=dill.load(open (r"C:\..etc..\Temp\dict.p","rb")) 
>>> mydict 
{'myfunc': <function myfunc at 0x000001FC9F4C69D8>} 
>>> mydict["myfunc"]() 
Hello world 

、それは、単純化のそのレベルにすべての作品を軽減します。

+0

こんにちは@BoarGules、あなたの提案に感謝します。私は 'func_dict_loaded.items()'を試しました。値は、単に、別のキーの中にネストされた同じキーか、モジュールへのファイルパスのいずれかの文字列です。私は、 'func_dict'、' Interp1dPicklable'、 'PolyValPicklable'のように、私が含めたい項目のどれも見ることができません。私はそれを間違って漬けたかもしれないと思うが、どこに起こったのか分からない。 – MoMiJi

関連する問題