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

加载含collections.defaultdict的pickle文件报错,求解决方法

解决加载含无默认工厂的defaultdict的pickle文件时的repr错误

你遇到的问题根源在于合作者创建defaultdict时没有传入默认工厂函数(即直接调用defaultdict()而非defaultdict(工厂函数))。这种情况下,pickle序列化后的defaultdict对象的default_factory属性为None,加载后当Python尝试生成该对象的字符串表示(repr)时就会触发Unable to get repr for <class 'collections.defaultdict'>错误。

解决方案1:加载后转换为普通字典(最简单)

如果不需要保留defaultdict的自动生成默认值功能,直接将加载后的对象转为普通字典即可彻底解决问题:

from collections import defaultdict
import pickle

with open("dict_.pickle", "rb") as handle:
    dict_ = pickle.load(handle)
    # 转换为普通字典
    dict_ = dict(dict_)

转换后就可以像使用普通字典一样正常操作,不会再出现repr相关错误。

解决方案2:手动设置default_factory以保留defaultdict结构

如果需要继续使用defaultdict的特性,可以在加载后手动为其设置一个默认工厂函数:

from collections import defaultdict
import pickle

with open("dict_.pickle", "rb") as handle:
    dict_ = pickle.load(handle)
    # 设置默认工厂,示例为返回None,可根据需求替换为其他函数(比如int、list等)
    dict_.default_factory = lambda: None

设置后,该defaultdict的repr可以正常生成,也能继续使用默认值功能。

解决方案3:让合作者修改保存代码(从根源避免)

如果后续还有类似文件需要交互,建议让合作者修改保存逻辑,二选一即可:

  1. 创建defaultdict时明确传入默认工厂函数(如果确实需要defaultdict的功能):
    from collections import defaultdict
    import pickle
    
    # 比如设置默认值为None,或根据实际需求设置int、list等
    dict_ = defaultdict(lambda: None)
    example_keys = ["a", "b", "c"]
    for i, key_ in enumerate(example_keys):
        dict_[key_] = 2 * i
    pickle.dump(dict_, open("dict_.pickle", "wb"))
    
  2. 保存前将defaultdict转为普通字典(如果不需要其特殊功能):
    from collections import defaultdict
    import pickle
    
    dict_ = defaultdict()
    example_keys = ["a", "b", "c"]
    for i, key_ in enumerate(example_keys):
        dict_[key_] = 2 * i
    # 转换为普通字典后再保存
    pickle.dump(dict(dict_), open("dict_.pickle", "wb"))
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:10:52