跳转到主要内容

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)甚至不存在。抱歉。

这些适配类也欺骗了isinstanceissubclass,所以你的类型检查将同样糟糕。

我实际上只在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 (3.3 kB 查看哈希值)

上传时间

由以下支持