PEP 417的dictproxy(不可变dicts)适用于所有人
dictproxyhack的Python项目详细描述
向所有人公开不可变的dictproxy类型(?)python的版本。
PEP416要求输入frozendict类型,但被拒绝。另一种选择是 要公开dictproxy,用于且不可变对象的 {TT4}$,它封装现有的DICT并提供只读接口 为了它。这种类型自2.2以来就已经存在,但它从未有过Python之地。 构造函数。
直到现在。但只有3.3+。这对我们中的一些人没什么帮助。
这个模块笨拙地将同一类型的内容公开给先前版本的python。
用法
from dictproxyhack import dictproxy myproxy = dictproxy(dict(foo="bar")) print(myproxy['foo']) myproxy['baz'] = "quux" # TypeError
因为代理持有对底层dict的引用(但不提供 任何恢复的方法),您都可以轻松地实现frozendict:
def frozendict(*args, **kwargs): return dictproxy(dict(*args, **kwargs))
不如直接把它放在你需要的地方,真的。
依赖关系
Python。应该在任何地方工作。也许吧。
在python 3.3+上,您将得到真正的mappingproxytype,它位于 types模块为MappingProxyType。
在cpython 2.5+上,您会得到一个伪类,该类强制实例化 dictproxy对象通过ctypes诡计。
在上,您可以得到一个常规类,它包装一个dict和 不实现映射接口的任何变异部分。不是很好 解决方案,但足够好,只适用于直到您最喜欢的端口赶上 有3.3的标准库。
在2.6之前的non-c python端口上,可以得到dict, 因为^ {tt13}$abc甚至不存在。对不起的。
shim类还愚弄isinstance和issubclass,因此 打字检查在任何地方都应该同样糟糕。
实际上我只在cpython 2.6、2.7、3.2、3.3和pypy上尝试过这个库 2.1,但我有兴趣听听它在其他地方是否有效。
有问题
不要子类化dictproxy。python 3.3+不会让你,而其他的 版本的使用非常可疑。
dictproxy已在3.3+中重命名为mappingproxy,因此不要依赖于 repr匹配不同版本或任何内容。(使用 此模块的旧名称。)