pei’s blog

情報系の大学を出たSE1年生。主にプログラミング(機械学習寄り)の話題を書いていきます。

Python pickle化できないときの解決策(dill)

    今回はPythonのオブジェクトをシリアライズするライブラリのdillについて書きます。


    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.<locals>.a'







dillならそのようなオブジェクトもシリアライズできます!
dillはpipで簡単にインストールできます。

pip install dill

dillは基本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)