tuoheng_algN/vodsdk/test/collections/ChainMap.py

56 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
1、ChainMap是什么
ChainMap最基本的使用可以用来合并两个或者更多个字典当查询的时候从前往后依次查询。
ChainMap将多个字典视为一个解锁Python超能力。
ChainMap是由Python标准库提供的一种数据结构允许你将多个字典视为一个。换句话说:ChainMap是一个基于多dict的可更新的视图它的行为就像一个普通的dict。
ChainMap类用于快速链接多个映射以便将它们视为一个单元。它通常比创建新字典和多次调用update()快得多。
你以前可能从来没有听说过ChainMap你可能会认为ChainMap的使用情况是非常特定的。坦率地说你是对的。
我知道的用例包括:
通过多个字典搜索
提供链缺省值
经常计算字典子集的性能关键的应用程序
2、特性
1找到一个就不找了这个列表是按照第一次搜索到最后一次搜索的顺序组织的搜索查询底层映射直到一个键被找到。
2更新原始映射不同的是更新和删除只操作第一个映射。
3支持所有常用字典方法。
简而言之ChainMap将多个字典视为一个解锁Python超能力。
Python标准库中的集合模块包含许多为性能而设计的实用的数据结构。著名的包括命名元组或计数器。
今天通过实例我们来看看鲜为人知的ChainMap。通过浏览具体的示例我希望给你一个提示关于在更高级的Python工作中使用ChainMap将如何从中受益。
"""
from collections import ChainMap
baseline = {'music': 'bach', 'art': 'rembrandt'}
adjustments = {'art': 'van gogh', 'opera': 'carmen'}
test = ChainMap(adjustments, baseline)
print(test)
test1 = list(ChainMap(adjustments, baseline))
print(test1)
# 存在重复元素时,也不会去重
dcic1 = {'label1': '11', 'label2': '22'}
dcic2 = {'label2': '22', 'label3': '33'}
dcic3 = {'label4': '44', 'label5': '55'}
last = ChainMap(dcic1, dcic2, dcic3)
print(last)
print(last['label2'])
"""
new_child()方法
用法new_child(m=None)
返回一个新的ChainMap类包含了一个新映射(map)后面跟随当前实例的全部映射map。
如果m被指定它就成为不同新的实例就是在所有映射前加上 m如果没有指定就加上一个空字典
这样的话一个 d.new_child() 调用等价于ChainMap({}, *d.maps) 。这个方法用于创建子上下文,不改变任何父映射的值。
"""
aa = last.new_child(m={'key_new': 888})
print(aa)
"""
parents属性
属性返回一个新的ChainMap包含所有的当前实例的映射除了第一个。
这样可以在搜索的时候跳过第一个映射。使用的场景类似在 nested scopes 嵌套作用域中使用nonlocal关键词。
用例也可以类比内建函数super() 。一个d.parents 的引用等价于ChainMap(*d.maps[1:])。
"""
print(aa.parents)