← retour aux snippets

collections.ChainMap: fusionner dicts par priorité

Superposer plusieurs dictionnaires (ex: args > env > defaults) avec résolution par priorité.

python collections #collections#config

objectif

Superposer plusieurs dictionnaires (ex: args > env > defaults) avec résolution par priorité.

code minimal

from collections import ChainMap
defaults = {"host": "localhost", "port": 8080}
env = {"port": 9090}
args = {"debug": True}
cfg = ChainMap(args, env, defaults)
print(cfg["port"] == 9090 and cfg["host"] == "localhost")  # attendu: True

utilisation

from collections import ChainMap
base = {"a": 1}
override = {"a": 2, "b": 3}
merged = ChainMap(override, base)
print(dict(merged.items())["a"] == 2)

variante(s) utile(s)

from collections import ChainMap
cm = ChainMap({"x":1}, {"x":0})
print(cm.maps[0]["x"] == 1)

notes

  • ChainMap n’effectue pas de copie; les écritures se font dans le premier mapping.
  • Idéal pour appliquer des overrides sans merger coûteux.