Skip to content

Can not pickle instances of classes having methods decorated with lru_cache #13

@simonepozzoli

Description

@simonepozzoli

I detected that is impossible to pickle an instance of a class having a method decorated with lru_cache after the latter method is called. If the method is never called, the pickle succeeds.

Example:

import pickle
from methodtools import lru_cache

class MyClass(object):
    @lru_cache(maxsize=None)
    def decorated_method(self):
        return True

c = MyClass()
c.decorated_method()  # without this call the pickle succeeds

pickle.dumps(c)
Traceback (most recent call last):
  File "test_lru_cache_pickle.py", line 12, in <module>
    pickle.dumps(c)
  File "/usr/lib/python2.7/pickle.py", line 1380, in dumps
    Pickler(file, protocol).dump(obj)
  File "/usr/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/usr/lib/python2.7/pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/lib/python2.7/pickle.py", line 425, in save_reduce
    save(state)
  File "/usr/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/lib/python2.7/pickle.py", line 655, in save_dict
    self._batch_setitems(obj.iteritems())
  File "/usr/lib/python2.7/pickle.py", line 669, in _batch_setitems
    save(v)
  File "/usr/lib/python2.7/pickle.py", line 306, in save
    rv = reduce(self.proto)
  File "/usr/lib/python2.7/copy_reg.py", line 77, in _reduce_ex
    raise TypeError("a class that defines __slots__ without "
TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions