含有不可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
相关产品推荐
相关产品推荐

