pickle.py 920 B

1234567891011121314151617181920212223242526272829303132333435
  1. from __future__ import absolute_import
  2. try:
  3. import copyreg # pylint: disable=import-error
  4. except ImportError:
  5. import copy_reg as copyreg # pylint: disable=import-error
  6. import types
  7. def _pickle_method(method):
  8. try:
  9. func_name = method.__func__.__name__
  10. obj = method.__self__
  11. cls = method.__self__.__class__
  12. except AttributeError:
  13. func_name = method.im_func.__name__
  14. obj = method.im_self
  15. cls = method.im_class
  16. return _unpickle_method, (func_name, obj, cls)
  17. def _unpickle_method(func_name, obj, cls):
  18. for cls in cls.mro():
  19. try:
  20. func = cls.__dict__[func_name]
  21. except KeyError:
  22. pass
  23. else:
  24. break
  25. return func.__get__(obj, cls)
  26. # https://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods
  27. copyreg.pickle(types.MethodType, _pickle_method, _unpickle_method)