在Python 3.3中,向 ChainMap
模块添加了 collections
类:
例子:
>>> 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
它受this issue激励,并由this one公开(未创建
PEP
)。据我了解,它是拥有额外字典并使用
update()
进行维护的替代方法。问题是:
ChainMap
涵盖哪些用例? ChainMap
的真实示例? 额外的问题:是否可以在Python2.x上使用它?
我在Raymond Hettinger的
Transforming Code into Beautiful, Idiomatic Python
PyCon演讲中已经听说过,我想将其添加到我的工具箱中,但是我不知道何时应该使用它。 最佳答案
我喜欢@ b4hand的示例,确实,过去我曾使用过类似ChainMap的结构(但不使用ChainMap本身)来实现他提到的两个目的:多层配置覆盖和变量堆栈/作用域仿真。
与使用dict-update循环相比,我想指出ChainMap
的其他两个动机/优点/区别,因此仅存储“最终”版本”:
N
层和最多M
key ,构造一个ChainMap会使用O(N)
和每个查询O(N)
最坏情况[*],而使用更新循环来构造dict则会使用O(NM)
和每个查询O(1)
。这意味着,如果您经常构造并且每次仅执行几次查找,或者M
很大,ChainMap的惰性构造方法将对您有利。 [*](2)中的分析假设dict-access为
O(1)
,而实际上平均为O(1)
,最糟糕的情况是O(M)
。查看更多详细信息here。