Search code examples
pickleinstance-methods

can't pickle instancemethod objects


I met a problem of pickle, Code is that:

import cPickle

class A(object):

    def __init__(self):
        self.a = 1

    def methoda(self):
        print(self.a)


class B(object):

    def __init__(self):
        self.b = 2
        a = A()
        self.b_a = a.methoda

    def methodb(self):
        print(self.b)
if __name__ == '__main__':
    b = B()
    with open('best_model1.pkl', 'w') as f:
        cPickle.dump(b, f)

Error is that:

File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex raise TypeError, "can't pickle %s objects" % base.name TypeError: can't pickle instancemethod objects


Solution

  • You can if you use dill instead of cPickle.

    >>> import dill     
    >>> 
    >>> class A(object):
    ...   def __init__(self):
    ...     self.a = 1
    ...   def methods(self):
    ...     print(self.a)
    ... 
    >>> 
    >>> class B(object):
    ...   def __init__(self):
    ...     self.b = 2
    ...     a = A()
    ...     self.b_a = a.methods
    ...   def methodb(self):
    ...     print(self.b)
    ... 
    >>> b = B()
    >>> b_ = dill.dumps(b)
    >>> _b = dill.loads(b_)
    >>> _b.methodb()
    2
    >>> 
    

    Also see: Can't pickle <type 'instancemethod'> when using python's multiprocessing Pool.map()