Handling the classmethod pickling issue with copy_reg

前端 未结 3 1575
花落未央
花落未央 2021-02-04 14:17

I met a pickling error when dealing with multiprocessing:

 from multiprocessing import Pool

 def test_func(x):
     return x**2

 class Test:
     @classmethod
         


        
3条回答
  •  夕颜
    夕颜 (楼主)
    2021-02-04 15:04

    The following solution now also handles class methods correctly. Please let me know if there is still something missing.

    def _pickle_method(method):
        """
        Pickle methods properly, including class methods.
        """
        func_name = method.im_func.__name__
        obj = method.im_self
        cls = method.im_class
        if isinstance(cls, type):
            # handle classmethods differently
            cls = obj
            obj = None
        if func_name.startswith('__') and not func_name.endswith('__'):
            #deal with mangled names
            cls_name = cls.__name__.lstrip('_')
            func_name = '_%s%s' % (cls_name, func_name)
    
        return _unpickle_method, (func_name, obj, cls)
    
    def _unpickle_method(func_name, obj, cls):
        """
        Unpickle methods properly, including class methods.
        """
        if obj is None:
            return cls.__dict__[func_name].__get__(obj, cls)
        for cls in cls.__mro__:
            try:
                func = cls.__dict__[func_name]
            except KeyError:
                pass
            else:
                break
        return func.__get__(obj, cls)
    

提交回复
热议问题