Python 是否可以从MappingProxyType实例提取包装映射?

Python 是否可以从MappingProxyType实例提取包装映射?,python,python-3.x,python-internals,Python,Python 3.x,Python Internals,有没有跨平台的方法通过拥有某个映射对象的实例来获取对该映射对象的引用 >>> class A: pass >>> A.__dict__ # is there a way to get the wrapped dict of this proxy? mappingproxy({'__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref_

有没有跨平台的方法通过拥有某个映射对象的实例来获取对该映射对象的引用

>>> class A: pass
>>> A.__dict__ # is there a way to get the wrapped dict of this proxy?
mappingproxy({'__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None})
类似于
dict
,其中
\uuuu setattr\uuuu
方法始终会抛出错误。根据设计,您不能添加任何新的键/值对。但是,您可以在普通词典中获取其内容的一部分

假设您有一个映射代理

导入类型
#给一本普通字典。。。
字典={
“福”:10,
“酒吧”:20,
}
#已包装在映射代理中的。。。
proxy=types.MappingProxyType(字典)
#无法接受新的键/值对。。。
proxy[“baz”]=30#抛出TypeError:“mappingproxy”对象不支持项分配
您可以按如下方式创建其内部字典的索引:

dictionary\u copy=proxy.copy()
打印(键入(字典副本))#打印“”
打印(字典副本就是字典)#打印“False”,因为它是副本
字典副本[“baz”]=30#不会抛出任何错误

据我所知,如果不先制作副本,就无法提取原始字典,或添加新的键/值对。

您所说的“获取此代理的包装目录”是什么意思?你想从
A.中提取一些信息吗?@byxor例如,
d={1:2};mpd=types.MappingProxyType(d)
。如何从
mpd
中提取
d
?@facehugger没问题,我的答案不是很令人满意。你特别想做什么?也许有更好的办法。(这可能是一个)“MappingProxyType就像一个没有setattr方法的dict。”不,它有:
hasattr(m,“\uuu setattr””
。还有
打印(键入(字典副本))
打印
,但我认为这只是一种黑客行为。它看起来不像是一个命令。试试pickle.dumps(proxy.copy())
>>> import types
>>> m = {1: 2}
>>> mp = types.MappingProxyType(m) # how to extract m from mp?