2018年12月19日水曜日

pythonで__getattr__を定義したオブジェクトのpickle

Pythonでは__getattr__を定義すると属性が定義できる。が、これを定義すると、pickleしたときに、__getstate__が呼ばれてkeyerror で落ちる。よくわからないが、こんなふうにしたら落ちなくなった。正しい回避方法はわからない。。
import pickle

class conf(object):
    def __init__(self, dic):
        self._dic = dic
    def __getattr__(self, key):
        return self._dic[key]
    def __str__(self):
        return self._dic.__str__()
    def __getstate__(self):
        return pickle.dumps(self._dic)
    def __setstate__(self, d):
        self._dic = pickle.loads(d)


if __name__ == "__main__":

    c = conf({'a':1})
    d = pickle.loads(pickle.dumps(c))

    print(c.a)
    print(d.a)