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

含有不可pickle字段的对象转为可pickle对象的正确方法是什么?

关于将含不可pickle字段的对象转为可pickle对象的提问

我目前的做法是检测出不可pickle的字段,将其转为字符串(我也可以直接删除该字段,但这样会误报该字段不存在,因此我更倾向于保留字段但将值转为字符串)。不过我想知道有没有更规范、不那么取巧的实现方式。

我当前使用的代码如下:

def make_args_pickable(args: Namespace) -> Namespace:
    """
    返回args命名空间的副本,不可pickle的对象会被转为字符串格式
    注意:当前实现未经过深拷贝场景测试
    参考:
        - 相关社区讨论:如何让含不可pickle字段的对象可被pickle
    """
    pickable_args = argparse.Namespace()
    # 遍历args中的所有字段,如果不可pickle则转为字符串,否则保留原值
    # vars()函数会返回给定对象的__dict__属性
    for field in vars(args):
        field_val: Any = getattr(args, field)
        if not dill.pickles(field_val):
            field_val: str = str(field_val)
        setattr(pickable_args, field, field_val)
    return pickable_args

背景说明

我这么做主要是为了处理携带的tensorboard对象,非常麻烦(不过得益于wandb/weights and biases的存在,我现在应该不再需要.tb字段了)。这一点影响不大,但提供背景总是好的。

相关内容

  • 对象可pickle(pickle-able)是什么意思?
  • Python中如何将不可pickle的对象转为可pickle对象?

编辑补充

我决定不再使用dill,因为它有时候无法恢复类/对象(大概率是因为它无法保存类/对象的代码等信息),因此我打算只使用pickle(这也是PyTorch中推荐的实现方式)。

那么不使用dill,仅用官方pickle库检查对象是否可pickle的规范(最好是经过优化的)方法是什么?

下面这种方法是最优解吗?

def is_picklable(obj):
  try:
    pickle.dumps(obj)

  except pickle.PicklingError:
    return False
  return True

因此我当前的解决方案如下:

def make_args_pickable(args: Namespace) -> Namespace:
    """
    返回args命名空间的副本,不可pickle的对象会被转为字符串格式
    注意:当前实现未经过深拷贝场景测试
    参考:
        - 相关社区讨论:如何让含不可pickle字段的对象可被pickle
    """
    pickable_args = argparse.Namespace()
    # 遍历args中的所有字段,如果不可pickle则转为字符串,否则保留原值
    # vars()函数会返回给定对象的__dict__属性
    for field in vars(args):
        field_val: Any = getattr(args, field)
        # 如果当前字段值不可pickle,转为字符串使其可被pickle
        if not dill.pickles(field_val):
            field_val: str = str(field_val)
        elif not is_picklable(field_val):
            field_val: str = str(field_val)
        # 执行到此处保证字段值可pickle,写入新的args对象
        setattr(pickable_args, field, field_val)
    return pickable_args


def make_opts_pickable(opts):
    """ 让命名空间可被pickle """
    return make_args_pickable(opts)


def is_picklable(obj: Any) -> bool:
    """
    检查对象是否可被pickle
    参考:
        - 相关社区讨论:如何让含不可pickle字段的对象可被pickle
    """
    import pickle
    try:
        pickle.dumps(obj)
    except pickle.PicklingError:
        return False
    return True

注意事项

我需要“官方”/经过测试的方案的原因之一是,PyCharm会在try catch捕获异常时中断,这不符合我的预期,我希望它仅在遇到未处理异常时才中断。


内容的提问来源于stack exchange,提问作者Charlie Parker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:54:03