当前位置: 首页 > 面试题库 >

collections.ChainMap的目的是什么?

於鸿羲
2023-03-14
问题内容

在Python
3.3中ChainMap,向该collections模块添加了一个类:

提供ChainChain类,用于快速链接许多映射,因此可以将它们视为一个单元。它通常比创建新字典并运行多个update()调用要快得多。

例:

>>> 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

它是由动机这个问题,并予以公布的这一个(没有PEP创建)。

据我了解,它是拥有额外字典并使用update()s进行维护的替代方法。

问题是:

  • ChainMap涵盖了哪些用例?
  • 有现实世界的例子ChainMap吗?
  • 是否在切换到python3的第三方库中使用?

额外的问题:是否可以在Python2.x上使用它?

我在Transforming Code into Beautiful, Idiomatic PythonRaymond
Hettinger的PyCon演讲中已经听说过,我想将其添加到我的工具箱中,但是我不知道何时应该使用它。


问题答案:

我喜欢@
b4hand的示例,确实,过去我曾使用过类似ChainMap的结构(但不使用ChainMap本身)来实现他提到的两个目的:多层配置覆盖和变量堆栈/作用域仿真。

ChainMap与使用dict-update循环相比,我想指出的其他两个动机/优势/区别,因此仅存储“最终”版本”:

  1. 详细信息: 由于ChainMap结构是“分层的”,因此它支持回答以下问题:我得到“默认”值还是被覆盖?什么是原始(“默认”)值?该值在什么级别被覆盖(借用@ b4hand的配置示例:user-config或command-line-overrides)?使用简单的字典,回答这些问题所需的信息已经丢失。

  2. 速度权衡: 假设每个N层都有层,并且最多有M键,构造ChainMap需要O(N)和每个查询的O(N)最坏情况[*],而构造一个使用update-loop需要O(NM)和每个查询的字典O(1)。这意味着,如果您经常构造并且每次仅执行几次查找,或者查找次数M很大,ChainMap的惰性构造方法将对您有利。

[*](2)中的分析假设dict-
access为O(1),而实际上它是O(1)平均水平,并且是O(M)最坏的情况。在这里查看更多详细信息。



 类似资料:
  • 问题内容: 如果可能,如何举例说明如何实现JNDI的用法? 问题答案: JNDI是Java命名和目录接口。它用于分离应用程序 开发人员 和应用程序 部署 人员 的关注点。在编写依赖于数据库的应用程序时,无需担心用于连接该数据库的用户名或密码。JNDI允许开发人员为数据库命名,并依靠部署者将该名称映射到数据库的实际实例。 例如,如果您要编写在Java EE容器中运行的代码,则可以编写此代码来获取JN

  • 问题内容: 我正在阅读angular2引用,发现了这个。我想知道以下参数是什么意思? 问题答案: 该文件对应于TypeScript编译器(tsc)的配置。 这些链接可以为您提供有关这些属性的详细信息: http://www.typescriptlang.org/docs/handbook/tsconfig-json.html http://json.schemastore.org/tsconfig

  • 问题内容: 仅在包装内提供。它继承自,并且只有一个子类(),该子类仅可从包内部使用。 问题答案: 来源。 我猜想MutableBigInteger在内部用于BigInteger繁重的计算,但由于频繁的重新分配而减慢了计算速度。我不确定为什么它不作为java.math的一部分导出。也许对可变值类别有些厌恶? 为了澄清“可变”: 标准BigInteger在整个生命周期中都有一个值,给定两个BigInt

  • 问题内容: 我遇到了一个问题,我分配了一个名为的变量,然后从本质上对用户进行了身份验证,然后检查了是否。我希望它们不一样,应该包含 AnonymousUser。令我惊讶的是,它们是相同的。 样例代码: 然后,我发现prior_user实际上包含django.utils.functional.SimpleLazyObject的实例,因此我假设它是某种惰性查找类型的东西,即,直到实际使用之前,都不会查

  • 我们使用Veracode静态代码分析来发现和修复代码漏洞。一个反复出现的主题是,他们引用ESAPI作为修复它们的推荐解决方案,例如CW117(如何修复Veracode CWE 117(日志的不正确输出中和)) 然而,我真的不明白拥有一个独立的库有什么意义,它只是在其他库之上的某种安全层。如果一个库(如日志API)有漏洞,我为什么要首先使用它?我会为那个特定的开源社区做出贡献并修复那里的漏洞。或者使

  • 我几天前听说了Docker的事,想过去看看。 但事实上,我不知道这个“容器”的用途是什么? 什么是容器? 它能取代一个专门用于开发的虚拟机吗? 简单地说,在公司中使用Docker的目的是什么?主要的优势?