我喜欢@
b4hand的示例,确实,过去我曾使用过类似ChainMap的结构(但不使用ChainMap本身)来实现他提到的两个目的:多层配置覆盖和变量堆栈/作用域仿真。
ChainMap与使用dict-update循环相比,我想指出的其他两个动机/优势/区别,因此仅存储“最终”版本”:
详细信息: 由于ChainMap结构是“分层的”,因此它支持回答以下问题:我得到“默认”值还是被覆盖?什么是原始(“默认”)值?该值在什么级别被覆盖(借用@ b4hand的配置示例:user-config或command-line-overrides)?使用简单的字典,回答这些问题所需的信息已经丢失。
速度权衡: 假设每个
N
层都有层,并且最多有M
键,构造ChainMap需要O(N)
和每个查询的O(N)
最坏情况[*],而构造一个使用update-loop需要O(NM)
和每个查询的字典O(1)
。这意味着,如果您经常构造并且每次仅执行几次查找,或者查找次数M
很大,ChainMap的惰性构造方法将对您有利。
[*](2)中的分析假设dict-
access为
O(1),而实际上它是
O(1)平均水平,并且是
O(M)最坏的情况。在这里查看更多详细信息。



