You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用process_map调用类中装饰器包装方法时触发AttributeError

解决process_map调用装饰器修饰的类方法时的AttributeError问题

问题场景

在类内部使用tqdm.contrib.concurrent.process_map并发调用被装饰器包装的方法时,触发AttributeError: 'Foo' object has no attribute 'wrapper'错误。尝试将目标方法改为静态方法也无法解决,但希望保留process_map的进度条功能和装饰器。

相关代码:

from tqdm.contrib.concurrent import process_map

def error_handle(func):
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as exc:
            print(f"ERROR IN function {func.__name__} with exception {exc}")

    return wrapper

class Foo:
    def __init__(self) -> None:
         pass
    
    def bar_wrapper(self):
        process_map(self.bar, 100*[0], max_workers=10)

    @error_handle
    def bar(self, a):
        pass           

obj = Foo()
obj.bar_wrapper()

报错信息:

[...] AttributeError: 'Foo' object has no attribute 'wrapper'

问题原因

process_map基于Python的multiprocessing实现,多进程间传递对象依赖pickle序列化。当装饰器替换类方法为内部定义的wrapper函数后,pickle会尝试序列化这个嵌套的wrapper函数,但子进程的命名空间中不存在这个wrapper的定义,因此在反序列化时会尝试从Foo对象中查找wrapper属性,导致报错。

解决方案

使用functools.wraps装饰装饰器的wrapper函数,保留原函数的元数据(包括函数名、模块信息等),让pickle能够正确识别并序列化原类方法,而非嵌套的wrapper。

修改后的代码:

from tqdm.contrib.concurrent import process_map
import functools

def error_handle(func):
    @functools.wraps(func)  # 添加该行保留原函数元数据
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except Exception as exc:
            print(f"ERROR IN function {func.__name__} with exception {exc}")

    return wrapper

class Foo:
    def __init__(self) -> None:
         pass
    
    def bar_wrapper(self):
        process_map(self.bar, 100*[0], max_workers=10)

    @error_handle
    def bar(self, a):
        pass           

obj = Foo()
obj.bar_wrapper()

其他可选方案

如果上述方法不适用,还可以尝试:

  • 使用functools.partial将类实例和方法绑定后传入process_map:
from functools import partial

def bar_wrapper(self):
    process_map(partial(self.bar), 100*[0], max_workers=10)
  • 将装饰器改为类装饰器或其他可序列化的装饰器实现方式。

内容的提问来源于stack exchange,提问作者Unai Carbajo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:23:15