gpt4 book ai didi

python - 为什么 Python 的 defaultdict 与 pickle 的行为很奇怪?

转载 作者:太空宇宙 更新时间:2023-11-04 11:13:58 25 4
gpt4 key购买 nike

我正在使用 PySpark,它使用 Python 的 pickle 来序列化对象。我的用例有一个嵌套的 defaultdict数据结构如:

from collections import defaultdict

nested_dict = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))

pickle 这个nested defaultdict结构给出

PicklingError: Can't pickle at 0x1076cc9d8>: attribute lookup on __main__ failed

有一个 wonderful workaround在一个 SO 答案中。

我一直在尝试这样做,并想知道它会导致一些不直观的功能/用法。例如,

import pickle

def dd():
def di():
return defaultdict(int)
return defaultdict(di)

nested = defaultdict(dd)
pickle.loads(pickle.dumps(nested))

有效但跟随无效

def nested_dd():
def dd():
def di():
return defaultdict(int)
return defaultdict(di)
return defaultdict(dd)

pickle.loads(pickle.dumps(nested_dd()))

它给了

AttributeError: Can't pickle local object nested_dd.<locals>.dd

这里发生了什么?

最佳答案

同时 other serialization techniques存在,您只能pickle 可以通过from … import foo 找到的函数(因为这就是unpickling 函数所做的)。如果外部 defaultdict 不为空,您的“工作”示例将失败,因为每个嵌套字典都有一个本地函数作为它的默认工厂。

在这种情况下,由于这些函数都没有关闭任何东西,您可以将它们写在顶层。

关于python - 为什么 Python 的 defaultdict 与 pickle 的行为很奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57475733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com