Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

简而言之ChainMap:将多个字典视为一个,解锁Python超能力。

Python标准库中的集合模块包含许多为性能而设计的实用的数据结构。著名的包括命名元组或计数器。

今天,通过实例,我们来看看鲜为人知的ChainMap。通过浏览具体的示例,我希望给你一个提示,关于在更高级的Python工作中使用ChainMap将如何从中受益。

免责声明:这篇文章是关于Python的一个相当高级的特性。如果你刚入门,请等一等!

ChainMap是什么?

ChainMap是由Python标准库提供的一种数据结构,允许你将多个字典视为一个。

ChainMap上的官方文档如下:

ChainMap将多个dict或其他映射组合在一起以创建单个可更新视图。[…] 查找基础映射,直到找到key为止。[…]如果其中一个基础映射得到更新,这些更改将反映在ChainMap中。 […] 支持所有常用的字典方法。

换句话说:ChainMap是一个基于多dict的可更新的视图,它的行为就像一个普通的dict。

你以前可能从来没有听说过ChainMap,你可能会认为ChainMap的使用情况是非常特定的。坦率地说,你是对的。

我知道的用例包括:通过多个字典搜索

提供链缺省值

经常计算字典子集的性能关键的应用程序

我们将通过两个例子来说明。

注意:这两个例子是受到Mike Driscoll在文章的启发。为了我的目的,我已经调整了它们,但一定要阅读他的帖子另一个关于ChainMap的观点!

示例:购物清单

作为使用ChainMap的第一个例子,让我们考虑一张购物清单。我们的清单可能包含玩具,电脑,甚至衣服。所有这些条目都有价格,所以我们将把我们的条目存储在名称价格映射中。

现在我们可以使用ChainMap在这些不同的集合上建立一个单一的视图:

这使得我们可以查询清单,就像它是一个单一的字典:

正如官方文档所述,ChainMap支持所有常用的字典方法。我们可以使用.get()来搜索可能不存在的条目,或者使用 .pop()删除条目。

如果我们现在把玩具添加到toys字典里,它也将在清单中可用。这是ChainMap的可更新的方面。

Oh和ChainMap有一个恰当的字符串表示形式:

一个很好的特点是,在我们的例子中,toys, computers和clothing都是在相同的上下文中(解释器),它们可以来自完全不同的模块或包。这是因为ChainMap通过引用存储底层字典。

第一个例子是使用ChainMap一次搜索多个字典。

事实上,当构建ChainMap时,我们所做的就是有效地构建一系列字典。当查找清单中的一个项时,toys首先被查找,然后是computers,最后是clothing。

ChainMap真的只是一个映射链!

实际上,ChainMap的另一个任务是维护链的默认值。

我们将以一个命令行应用程序的例子来说明这是什么意思。

示例:CLI配置

让我们面对现实,管理命令行应用程序的配置可能是困难的。

配置来自多个源:命令行参数、环境变量、本地文件等。

我们通常实施优先级的概念:如果A和B都定义参数P,A的P值将被使用,因为它的优先级高于B。

例如,如果传递了命令行参数,我们可能希望在环境变量上使用命令行参数。

如何轻松地管理配置源的优先级?

一个答案是将所有配置源存储在ChainMap中。

因为ChainMap中的查找是连续地对每个底层映射执行的(按照他们传给构造函数的顺序),所以我们可以很容易地实现我们寻找的优先级。

下面是一个简单的命令行应用程序。调试参数从命令行参数、环境变量或硬编码默认值中提取:

在执行脚本时,我们可以检查是否首先在命令行参数中查找debug,然后是环境变量,最后是默认值:

整洁,对吧?

我为什么关心?

坦率地说,ChainMap是那些你可以忽略的Python特性之一。

还有其他ChainMap的替代方案。例如,使用更新循环——例如创建一个dict并用字典.update()它——可能奏效。但是,这只有在您不需要跟踪项目的起源时才有效,就像我们的多源CLI配置示例中的情况一样。

但是,当你知道ChainMap存在的时候,ChainMap可以让你更轻松,你的代码更优雅。

事实上,我第一次使用ChainMap是在一周前。为什么以前没有呢?我根本没用过。

我使用它是因为我需要频繁地计算字典的子集(基于值的属性),这代价很大。我需要实现恒定的时间查找以满足性能要求。

我决定把字典分成两个不同的dict,并在插入时执行分支。然后我用ChainMap把这两个dict组合在一起。这样,我就可以在单个字典中保留最初的视图——但也可以在固定时间内查找每个单独的字典。

总结

总而言之,我们一起看了ChainMap是什么,一些具体的使用示例,以及如何在现实生活中,性能关键的应用程序中使用ChainMap。

如果您想了解更多关于Python的高性能数据容器的信息,请务必从Python的标准库中collections模块中查看其他出色类和函数。英文原文:https://blog.florimondmanca.com/a-practical-usage-of-chainmap-in-python

译者:张新英

python map用法_Python中ChainMap的一种实用用法相关推荐

  1. python中numpy的用法_Python中numpy多维数组的用法

    继上篇讲过numpy如何构建多维数组之后,今天我们来学习numpy多维数组的用法. 加法和减法操作要求操作双方的维数信息一致,均为M*N为数组方可正确执行操作. a = np.arange(4) 输出 ...

  2. python中字符串函数的用法_python中字符串内置函数的用法介绍(代码)

    本篇文章给大家带来的内容是关于python中字符串内置函数的用法介绍(代码) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. capitalize() 首字母大写a='somewor ...

  3. python中字符串函数的用法_python中字符串内置函数的用法总结

    capitalize() 首字母大写 a='someword' b=a.capitalize() print(b) ->Someword casefold()&lower() 所有字母变 ...

  4. python中try的用法_python中的 try...except...finally 的用法

    python中的 try...except...finally 的用法 author:headsen chen date:2018-04-09 16:22:11 try, except, finall ...

  5. python的命名空间_python中命名空间的三种方式介绍(附示例)

    本篇文章给大家带来的内容是关于python中命名空间的三种方式介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. python中的命名空间分三种: 内置的命名空间,在启动解 ...

  6. python map用法_Python中 map()函数的用法详解

    python map()函数问题 使用map()函数生成一个值D但是检测D的长度时,只能测一次,一次之后D似不知道你的dataSet 是什么数据,是否是从数据库取出来的结果游标, 如果是的 那么dat ...

  7. python里map函数_python中map()函数的用法讲解

    原博文 2018-10-26 12:59 − map函数的原型是map(function, iterable, -),它的返回结果是一个列表. 参数function传的是一个函数名,可以是python ...

  8. zip在python中的用法_Python中zip()函数用法实例教程

    本文实例讲述了Python中zip()函数的定义及用法,相信对于Python初学者有一定的借鉴价值.详情如下: 一.定义: zip([iterable, ...])zip()是Python的一个内建函 ...

  9. python的for语句用法_python中list循环语句用法实例

    本文实例讲述了python中list循环语句用法.分享给大家供大家参考.具体用法分析如下: Python 的强大特性之一就是其对 list 的解析,它提供一种紧凑的方法,可以通过对 list 中的每个 ...

最新文章

  1. hadoop job 数量_大数据Hadoop常见面/笔试题
  2. 大数据分析决策平台问题总结
  3. 【408预推免复习】计算机组成原理之输入输出系统
  4. Toast的功能和用法
  5. vant按需引入没样式_传统背景墙早看腻了,不如走一圈石膏线简单好看,8种样式随意选...
  6. 2017年9月分c语言,2020年9月中国编程语言排行榜
  7. 抛出异常–缓慢而丑陋
  8. 2005年全球H.264编解码器荟萃
  9. 2018 年,React 将独占web前端框架鳌头?
  10. 传递给系统调用的数据区域太小怎么解决_一口气说出“分布式追踪系统”原理!...
  11. 50行代码,带你理解梯度下降法(Gradient Descent Method)
  12. 【转】VC6.0+icc编译STLPort5.2
  13. 控制文件丢失的恢复(续)
  14. 查询数量查看表的所有相关列信息
  15. C语言:基于Easyx库实现连连看小游戏
  16. 乐玩模块脚本实战教程辅助脚本制作开发视频
  17. 十折交叉验证python_Python机器学习:6.2 K折交叉验证评估模型性能
  18. 《可复制的领导力》脑图
  19. 山东理工大学ACM平台题答案关于C语言 1228 两数组最短距离
  20. AI前沿论坛会议—文字智能和游戏智能总结篇

热门文章

  1. VTK修炼之道5_Procedural Source Object
  2. MySQL数据库中导入导出方法以及工具介绍
  3. C语言使用fopen的两点注意事项
  4. [编程题]数字分类 (20)
  5. C语言中%c与%s的区别与划分
  6. JSF的web.xml配置
  7. Spring Security --SecurityConfig的详细配置
  8. HttpClient、OKhttp、RestTemplate对比
  9. 五、Netty核心组件
  10. 使用Idea创建SpringCloud父子工程