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

 今回は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)

コメントを残す

メールアドレスが公開されることはありません。