ChainMap
is new in version 3.3
Returns a new ChainMap
object given a number of maps
. This object groups multiple dicts or other mappings together to create a single, updateable view.
ChainMap
s are useful managing nested contexts and overlays. An example in the python world is found in the implementation of the Context
class in Django's template engine. It is useful for quickly linking a number of mappings so that the result can be treated as a single unit. It is often much faster than creating a new dictionary and running multiple update()
calls.
Anytime one has a chain of lookup values there can be a case for ChainMap
. An example includes having both user specified values and a dictionary of default values. Another example is the POST
and GET
parameter maps found in web use, e.g. Django or Flask. Through the use of ChainMap
one returns a combined view of two distinct dictionaries.
The maps
parameter list is ordered from first-searched to last-searched. Lookups search the underlying mappings successively until a key is found. In contrast, writes, updates, and deletions only operate on the first mapping.
import collections
# define two dictionaries with at least some keys overlapping.
dict1 = {'apple': 1, 'banana': 2}
dict2 = {'coconut': 1, 'date': 1, 'apple': 3}
# create two ChainMaps with different ordering of those dicts.
combined_dict = collections.ChainMap(dict1, dict2)
reverse_ordered_dict = collections.ChainMap(dict2, dict1)
Note the impact of order on which value is found first in the subsequent lookup
for k, v in combined_dict.items():
print(k, v)
date 1
apple 1
banana 2
coconut 1
for k, v in reverse_ordered_dict.items():
print(k, v)
date 1
apple 3
banana 2
coconut 1