collections.ChainMap în Python

Modulul collections Python 3.3+

Grupează mai multe dicționare într-o singură vedere: o cheie este căutată pe rând în fiecare.

Sintaxă
from collections import ChainMap
cm = ChainMap(d1, d2, ...)
cm.new_child(m=None, **kwargs)
cm.parents

Ce face collections.ChainMap

ChainMap(d1, d2, d3) nu copiază nimic: la citire caută cheia întâi în d1, apoi în d2 și așa mai departe. Este perfect pentru setări pe niveluri: argumentele din linia de comandă peste variabilele de mediu peste valorile implicite.

Scrierile, actualizările și ștergerile (pop, popitem, clear) afectează doar primul dicționar. new_child() creează un ChainMap nou cu un dicționar în față, iar parents dă lanțul fără primul. get(), copy() (copiază primul dicționar) și fromkeys() funcționează ca la dicționare.

Parametri

Parametru Descriere
*maps Dicționarele, în ordinea priorității.

Ce returnează

Un obiect ChainMap.

Exemple

Exemplul 1: Setări pe niveluri

from collections import ChainMap
implicite = {"limba": "en", "tema": "luminoasă", "font": 12}
utilizator = {"limba": "ro"}
setari = ChainMap(utilizator, implicite)
print(setari["limba"], setari["font"], setari.get("culoare", "-"))
setari["font"] = 14
print(utilizator, implicite["font"])
print(dict(setari))

Rezultat

ro 12 -
{'limba': 'ro', 'font': 14} 12
{'limba': 'ro', 'tema': 'luminoasă', 'font': 14}

Exemplul 2: new_child, parents și metodele de ștergere

from collections import ChainMap
global_ = {"x": 1}
local = ChainMap(global_).new_child({"x": 2, "y": 3})
print(local["x"], local.parents["x"])
print(local.pop("y"), local.popitem(), local.maps)
local.clear()
print(local, ChainMap.fromkeys("ab", 0), local.copy())

Rezultat

2 1
3 ('x', 2) [{}, {'x': 1}]
ChainMap({}, {'x': 1}) ChainMap({'a': 0, 'b': 0}) ChainMap({}, {'x': 1})

Greșeli frecvente

  • Te aștepți ca cm["cheie"] = valoare să schimbe dicționarul în care se află deja cheia. Scrierea merge mereu în primul dicționar.

Comenzi înrudite