Python 3.3+collectionsпонятие
collections.ChainMap
chainmap
Объединяет несколько словарей в один вид. Поиск идёт по порядку. maps — список словарей, new_child() — новый дочерний уровень, parents — все кроме первого.
Синтаксис
collections.ChainMap(*maps)
.new_child(m=None)
.parents
ChainMap не копирует словари, а держит ссылки на них: изменение исходного словаря сразу видно через цепочку — это принципиальное отличие от снимка {**defaults, **overrides}. Главная ловушка — асимметрия чтения и записи: ключ ищется по всем словарям, но присваивание, pop и del работают только с первым, поэтому удаление ключа, который виден при чтении, но лежит в defaults, падает с KeyError.
Примеры
from collections import ChainMap
defaults = {'color': 'red', 'size': 10}
user = {'color': 'blue'}
chain = ChainMap(user, defaults)
print(chain['color']) # → blue (из user)
print(chain['size']) # → 10 (из defaults)
print(chain.maps) # → [{'color': 'blue'}, {'color': 'red', 'size': 10}]
child = chain.new_child({'size': 20})
print(child['size']) # → 20
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности