5.3.1 ChainMap对象

ChainMap类用来管理多个映射对象,以便把所有映射对象当作一个对象单元来处理。这样做的好处是比在一个字典里创建多个映射的数据,并调用每个映射的update()函数要快一些。同时可以使用它来模拟嵌套作用域和模板化处理。

class collections.ChainMap(*maps)

ChainMap类可把多个字典或者其它映射对象放在一起,组成一个单一的、可更新的映射对象。如果参数没有指定任何映射对象,默认会创建一个空的映射对象。所有传入来的映射对象保存在一个列表里,可以通过maps属性来访问和更新这些映射对象。当在查找时,会查看所有映射对象,但当在写入、更新和删除时,只会操作第一个满足条件的映射对象。ChainMap会通过引用的方式来合并所有映射对象的元素,因此只要任何一个映射对象里的元素进行更新,都会反映到ChainMap对象里。所以所有字典相同的操作方法都是支持的,另外增加一个maps属性,增加一个创建子字典的方法和访问除了第一个映射对象之外所有其它映射对象的属性。

例子:

#python 3.4

import collections

 

x = {'a': 1, 'b': 2}

y = {'b': 10, 'c': 11}

z = collections.ChainMap(y, x)

for k, v in z.items():

    print(k, v)

print('\n')

print(z)

结果输出如下:

a 1

b 10

c 11

 

 

ChainMap({'b': 10, 'c': 11}, {'a': 1, 'b': 2})

 

maps 

返回用户可更新的映射对象列表。在这个列表里包括所有添加的映射对象,可以更新任何一个列表里显示的映射对象。在这个属性至少会包括一个映射对象。

例子:

#python 3.4

import collections

 

x = {'a': 1, 'b': 2}

y = {'b': 10, 'c': 11}

z = collections.ChainMap(y, x)

print(z.maps)

z.maps[0]['c'] = 20

print(z.maps)

结果输出如下:

[{'b': 10, 'c': 11}, {'a': 1, 'b': 2}]

[{'b': 10, 'c': 20}, {'a': 1, 'b': 2}]

 

new_child(m=None) 

创建一个新的ChainMap对象,在列表第一个元素里插入映射对象m,后面紧跟原来所有映射对象。如果mNone,就插入一个空的字典对象。d.new_child()等价于ChainMap({}, *d.maps)操作。这个方法用来创建一个新的ChainMap对象,而不必影响旧的ChainMap对象的值。

例子:

#python 3.4

import collections

 

x = {'a': 1, 'b': 2}

y = {'b': 10, 'c': 11}

z = collections.ChainMap(y, x)

print(z.maps)

 

xx = {'d': 55, 'e': 88}

z = z.new_child(xx)

print(z.maps)

结果输出如下:

[{'c': 11, 'b': 10}, {'a': 1, 'b': 2}]

[{'e': 88, 'd': 55}, {'c': 11, 'b': 10}, {'a': 1, 'b': 2}]

 

parents 

返回除第一个映射对象之外的所有映射对象的 ChainMap对象。主要用来获取不同作用域嵌套情况,比如本地作用域、类作用域、全局作用域构造成的ChainMap就可以依次递归整个ChainMap对象,就不可以判断在不同作用域里出现了。本属性d.parents的操作相当于ChainMap(*d.maps[1:])

例子:

#python 3.4

import collections

 

x = {'a': 1, 'b': 2}

y = {'b': 10, 'c': 11}

z = collections.ChainMap(y, x)

print(z.maps)

 

xx = {'d': 55, 'e': 88}

z = z.parents

print(z.maps)

结果输出如下:

[{'c': 11, 'b': 10}, {'a': 1, 'b': 2}]

[{'a': 1, 'b': 2}]

 


蔡军生 QQ:9073204 深圳

你可能感兴趣的:(python,milang,ChainMap)