What is the purpose of collections.ChainMap?
在python 3.3中,
A ChainMap class is provided for quickly linking a number of mappings
so they can be treated as a single unit. It is often much faster than
creating a new dictionary and running multiple update() calls.
例子:
1 2 3 4 5 6 7 8 9 | >>> from collections import ChainMap >>> x = {'a': 1, 'b': 2} >>> y = {'b': 10, 'c': 11} >>> z = ChainMap(y, x) >>> for k, v in z.items(): print(k, v) a 1 c 11 b 10 |
它是受这个问题的推动,并由这个问题公开的(没有创建
据我所知,它是另一种选择,而不是拥有一个额外的字典,并用
问题是:
ChainMap 包含哪些用例?- 有没有关于
ChainMap 的真实例子? - 是否在第三方图书馆中使用切换到python3?
额外的问题:有没有办法在python2.x上使用它?
我在Raymond Hettinger的
我喜欢@b4hand的例子,事实上,我在过去的链表结构(但不是链表本身)中使用了两个目的:多层配置覆盖和变量堆栈/作用域仿真。
我想指出与使用dict更新循环相比,
更多信息:由于链图结构是"分层的",它支持回答这样的问题:我是得到"默认"值还是被覆盖的值?原始("默认")值是多少?值在什么级别被覆盖(借用@b4hand的配置示例:用户配置或命令行覆盖)?使用简单的听写,回答这些问题所需的信息已经丢失。
速度权衡:假设您在每个层中都有
(2)中的分析假设dict访问平均为
我可以看到对配置对象使用
如果您试图自己实现一个词法范围,那么它也可能对模拟在推送和弹出变量绑定处的堆栈帧很有用。
链图的标准库文档提供了几个例子,并链接到第三方库中的类似实现。具体地说,它命名Django的Context类和Enthund的MultiContext类。
我来试试这个:
链图看起来是一种非常简单的抽象。对于一个非常专业的问题来说,这是一个很好的解决方案。我提出这个用例。
如果你有:
然后,您可以考虑使用链映射在映射集合上创建视图。
但这一切都是事后证明。python的人遇到了一个问题,在他们的代码环境中提出了一个很好的解决方案,然后做了一些额外的工作来抽象他们的解决方案,这样我们可以在选择的时候使用它。给他们更多的力量。但这是否适合你的问题,由你来决定。
不完全回答你的:
Bonus question: is there a way to use it on Python2.x?
1 | from ConfigParser import _Chainmap as ChainMap |
但是要记住,这不是一个真实的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | __init__(self, *maps) __getitem__(self, key) keys(self) # And from DictMixin: __iter__(self) has_key(self, key) __contains__(self, key) iteritems(self) iterkeys(self) itervalues(self) values(self) items(self) clear(self) setdefault(self, key, default=None) pop(self, key, *args) popitem(self) update(self, other=None, **kwargs) get(self, key, default=None) __repr__(self) __cmp__(self, other) __len__(self) |
它的实现似乎也不是特别有效。