Python 创建自己的字典子集的字典 View

标签 python dictionary facade

正如 SO 上关于该主题的许多问题所证明的那样,获取字典的一部分是一项非常常见的任务,并且有一个相当不错的解决方案:

{k:v for k,v in dict.viewitems() if some_test(k,v)}

但这会创建一个新字典,它有自己的映射。对于许多操作,最好只拥有原始字典的不可变 View (即它不支持对 View 的赋值或删除操作)。实现这样的类型可能很容易,但本地实用程序类的激增并不是一件好事。

那么,我的问题是:是否有一种内置的方式来获取这样的“子集 View ”?或者是否有第三方库(最好通过 PyPi 提供)可以很好地实现此类实用程序?

最佳答案

似乎没有内置的方法来获取字典的 View 。最简单的解决方法似乎是 Jochen 的方法。我稍微调整了他的代码以使其适用于我的目的:

from collections import MutableMapping

class DictView(MutableMapping):
    def __init__(self, source, valid_keys):
        self.source, self.valid_keys = source, valid_keys

    def __getitem__(self, key):
        if key in self.valid_keys:
            return self.source[key]
        else:
            raise KeyError(key)

    def __len__(self):
        return len(self.valid_keys)

    def __iter__(self):
        for key in self.valid_keys:
            yield key

    def __setitem__(self, key, value):
        if key in self.valid_keys:
            self.source[key] = value
        else:
            raise KeyError(key)

    def __delitem__(self, key):
        self.valid_keys.remove(key)

d = dict(a=1, b=2, c=3)
valid_keys = ['a', 'c']
d2 = DictView(d, valid_keys)
d2['a'] = -1  # overwrite element 'a' in source dictionary
print d  # prints {'a': -1, 'c': 3, 'b': 2}

因此 d2 由于不同的 __repr__() 方法,除了打印外,在所有方面都像字典。从 dict 继承以获取 __repr__() 需要重新实现每个方法,就像 collections.OrderedDict 所做的那样。如果只需要一个只读 View ,可以继承 collections.Mapping 并保存 __setitem__()__delitem__() 的实现。我发现 DictView 对于从 self.__dict__ 中选择参数并以紧凑的形式传递它们很有用。

关于Python 创建自己的字典子集的字典 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9329537/

相关文章:

python - 有关获取 aerospike 集中记录总数的说明?是否需要 Lua 脚本?

python - 如何让lambda函数返回包含python中图像的json

Python 奇怪错误 : "TypeError: ' NoneType' object is not callable"

python - 我在 Python 3 的字典中调用函数

c# - 在 C# 中缓存存储字典的最佳方法

java - Spring 中的服务外观

python - Pandas:聚合列中的列表值

python - 如何将纯文本标题和列表传输到 Python 字典对象?

oop - 外观模式与 SRP

Javascript 门面模式从不显示初始设置