PEP 417的dictproxy(不可变字典)适用于所有人
项目描述
将不可变dictproxy类型暴露给所有(?)Python版本。
PEP416要求一个frozendict类型,但被拒绝。替代方案是公开暴露dictproxy,这是不可变对象的__dict__所使用的类型,它包装了一个现有的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+上,您将获得真正的mappingproxy类型,它在types模块中作为MappingProxyType存在。
在CPython 2.5+上,您将获得一个假类,它通过ctypes技巧强制实例化dictproxy对象。
在几乎任何其他东西上,您将获得一个包装dict并实现映射接口的任何变异部分的常规类。这不是一个了不起的解决方案,但足够好了,并且仅适用于您的最喜欢的端口赶上3.3的标准库。
在先于2.6版本的非C Python端口上,你基本上得到一个字典(dict),因为映射抽象基类(Mapping ABC)甚至不存在。抱歉。
这些适配类也欺骗了isinstance和issubclass,所以你的类型检查将同样糟糕。
我实际上只在CPython 2.6、2.7、3.2、3.3和PyPy 2.1上尝试了这个库,但我很想知道它是否在其他地方也能工作。
注意事项
不要继承dictproxy。Python 3.3+不允许这样做,其他版本的适配器几乎没有用处。
dictproxy在3.3+中被重命名为mappingproxy,所以不要依赖于不同版本的repr
来匹配或其他任何东西。(似乎使用旧名称对这个模块来说是合适的。)
项目详情
dictproxyhack-1.1.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 964eef82fba883d53783b08cbce90415380a5c26e5c2dba47548d1c3d0a591f8 |
|
MD5 | 5083fcc4ef164403d609a4ff9f9f659c |
|
BLAKE2b-256 | 96f7fee4c0445d3ccf8447a22f7d557b65134d4424852748e62db0b931ed4601 |