今回はPythonのオブジェクトをシリアライズするライブラリのdillについてです。
目次
pickleでシリアライズできない場合がある
pythonのシリアライズはpickleを使っている人が多いと思いますが、pickleだと特定の条件での関数オブジェクトをシリアライズできないなどの制約があります。
こんなコード書くな!って思うかもしれませんが、たとえばこんなコードはpickle化できません。
動的に作られた関数オブジェクト?の場合はpickle化できないみたいです。
import pickle
def build_func(text):
def a():
return text
return a
with open('./a.pkl', 'wb') as file:
func_obj = build_func("aaa")
pickle.dump(func_obj, file)
with open('./a.pkl', 'rb') as file:
func_obj = pickle.load(file)
このようなエラーが起きます
AttributeError: Can't pickle local object 'build_func..a'
dillの使い方
dillならそのようなオブジェクトもシリアライズできます。
dillはpipで簡単にインストールできます。
pip install dill
dillは基本pickleと同じように扱えるため、先ほどのコードはこのようになります。これでシリアライズが可能になります。
import dill as pickleとかにすればコード書き換えずに済みます。
import dill
def build_func(text):
def a():
return text
return a
with open('./a.dill', 'wb') as file:
func_obj = build_func("aaa")
dill.dump(func_obj, file)
with open('./a.dill', 'rb') as file:
func_obj = dill.load(file)