为了账号安全,请及时绑定邮箱和手机立即绑定

Python不能腌制getset_descriptor

Python不能腌制getset_descriptor

萧十郎 2022-07-19 11:00:30
我正在尝试types.MappingProxyType:class MyClass:    l = [1, 2]proxy = MyClass.__dict__然后我想从这个代理中提取字典:d = proxy.copy()print(type(d))#<class 'dict'>然后我想附加一些东西来列出值d:d["l"].append(3)但这也会影响proxy(当然):>>> print(proxy["l"])[1, 2, 3]我不想影响我们的proxy,所以我尝试使用copy.deepcopy:import copydict_2 = copy.deepcopy(d)它给出了一个错误:Traceback (most recent call last):  File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python37\istihza.py", line 18, in <module>    dict_2 = copy.deepcopy(d)  File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python37\lib\copy.py", line 150, in deepcopy    y = copier(x, memo)  File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python37\lib\copy.py", line 240, in _deepcopy_dict    y[deepcopy(key, memo)] = deepcopy(value, memo)  File "C:\Users\Dinçel\AppData\Local\Programs\Python\Python37\lib\copy.py", line 169, in deepcopy    rv = reductor(4)TypeError: can't pickle getset_descriptor objects我知道复制模块正在尝试使用泡菜模块用于复制的功能。 https://docs.python.org/3/library/copy.html#copy.deepcopy类可以使用相同的接口来控制它们用来控制酸洗的复制。有关这些方法的信息,请参阅模块 pickle 的描述。实际上,copy 模块使用了 copyreg 模块中注册的 pickle 函数。问题是,类型d是dict. 我们可以对字典进行深度复制:copy.deepcopy({"this":["is", "a", "dict"]})那么如果 type of dis dict,为什么我不能对其进行深度复制?或者是d不是真正的 dict 类型,它只是 Python 中的一个 hack?
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

d确实是一本字典。您遇到的问题是 pickle 无法序列化独立于类的类的方法和属性。当您查看内容时,d您会看到:


{'__module__': '__main__',

 'l': [1, 2, 3],

 '__dict__': <attribute '__dict__' of 'MyClass' objects>,

 '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,

 '__doc__': None}

__dict__和的值__weakref__是对象的属性MyClass。您不能在不序列化的情况下对它们进行序列化MyClass。


此外,如果您检查每一个的类型,您可以看到这是您看到的错误的来源:


type(d['__dict__']), type(d['__weakref__'])

# returns:

(getset_descriptor, getset_descriptor)


查看完整回答
反对 回复 2022-07-19
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信