代码之家  ›  专栏  ›  技术社区  ›  Ladenkov Vladislav

pickle无法pickle名称重复

  •  0
  • Ladenkov Vladislav  · 技术社区  · 6 年前

    我在试着泡菜 namedtuple 这样地:

    def f():
        TemplateData = namedtuple('TemplateData', ['field1', 'field2'])
        f1 = np.random.randn(50,50)
        f2 = np.random.randn(50,50)
        td = TemplateData(f1, f2)
        return td
    
    data = f()
    with open("aaaa.pkl", "wb") as fl:
        pkl.dump(data, fl)
    

    但这是由于错误而崩溃的:

    PicklingError: Can't pickle <class '__main__.TemplateData'>: it's not the same object as __main__.TemplateData
    

    发生了什么? 如果 pickle 存储命名的tuple不是最好的方法吗?最有效的方法是什么?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Batman    6 年前

    您需要在函数外部定义namedtuple,并将namedtuple的名称更改为 TemplateData .

    TemplateData = namedtuple('TemplateData', ['field1', 'field2'])
    f1 = np.random.randn(50,50)
    f2 = np.random.randn(50,50)
    model_cluster = TemplateData(f1, f2)
    
    with open("aaaa.pkl", "wb") as fl:
        pkl.dump(model_clusters_dict, fl)