Python 具有修饰功能的多处理池为我提供了;对象没有属性“;

Python 具有修饰功能的多处理池为我提供了;对象没有属性“;,python,python-multiprocessing,Python,Python Multiprocessing,以下是可复制代码: from multiprocessing import Pool def method_exception_catcher(method): def method_exception_caught(*args, **kwargs): try: return method(*args, **kwargs) except Exception as e: raise type(e)(st

以下是可复制代码:

from multiprocessing import Pool

def method_exception_catcher(method):

    def method_exception_caught(*args, **kwargs):

        try:
            return method(*args, **kwargs)

        except Exception as e:
            raise type(e)(str(e) + ' from [{}] method'.format(method.__name__)) 

    return method_exception_caught

class MyClass():

    @method_exception_catcher
    def do_something(self, elem):
        return 1/0

    @method_exception_catcher
    def parallel_do_something(self):

        with contextlib.closing(Pool(processes=1)) as p:

            procs = [p.apply_async(self.do_something, args=(3, )) for k in range(1)]
            results = [proc.get() for proc in procs]
            p.close()
            p.join()

        return results

MyClass().parallel_do_something()
该代码给出了“AttributeError:'MyClass'对象没有属性'method\u exception\u Capture'”错误

如何修复此问题并使其成功地提高0除法错误?谢谢

更新:

以下是完整的错误输出:

Process ForkPoolWorker-4:
Traceback (most recent call last):
  File "/usr/lib64/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib64/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/lib64/python3.6/multiprocessing/pool.py", line 108, in worker
    task = get()
  File "/usr/lib64/python3.6/multiprocessing/queues.py", line 337, in get
    return _ForkingPickler.loads(res)
AttributeError: 'MyClass' object has no attribute 'method_exception_caught'

酸洗一个函数只是写下它的(模块和)名称;取消勾选(导入模块并查找名称)。由于类的方法(即,从装饰程序返回的函数)有一个
方法的
名称\uuuuuuuu
,这就是pickling使用的方法

答案(出于其他原因,这也是一个好主意)是使用
functools.wrapps
使包装函数模拟包装函数:

def decorator(f):
  @functools.wraps(f)
  def wrap(*a,**kw): return f(*a,**kw)
  return wrap

始终将完整的错误消息(从单词“Traceback”开始)作为文本(而不是屏幕截图)进行讨论(不是评论)。还有其他有用的信息。你是对的。我添加了完整的消息。