Configuration overlays start with defaults and then apply environment-specific values.

dictionary overlay Copying defaults before update keeps the base configuration unchanged.

Config Overlay

environment
config_overlay.py
Replay: real traced execution (multi-file project)
base = {
    "debug": "false",
    "region": "us",
    "workers": "2",
}

dev = {
    "debug": "true",
    "workers": "1",
}

prod = {
    "region": "eu",
    "workers": "4",
}

environment = "dev"

config = base.copy()
if environment == "dev":
    config.update(dev)
else:
    config.update(prod)

parts = []
for key in sorted(config):
    parts.append(key + "=" + config[key])

print("config=" + ";".join(parts))
base = {
    "debug": "false",
    "region": "us",
    "workers": "2",
}

dev = {
    "debug": "true",
    "workers": "1",
}

prod = {
    "region": "eu",
    "workers": "4",
}

environment = "prod"

config = base.copy()
if environment == "dev":
    config.update(dev)
else:
    config.update(prod)

parts = []
for key in sorted(config):
    parts.append(key + "=" + config[key])

print("config=" + ";".join(parts))
  1. base ← {'debug': 'false', 'region': 'us', 'workers': '2'}, dev ← {'debug': 'true', 'workers': '1'}

    1base→ {'debug': 'false', 'region': 'us', 'workers': '2'} = {2    "debug": "false",3    "region": "us",4    "workers": "2",5}67dev→ {'debug': 'true', 'workers': '1'} = {8    "debug": "true",9    "workers": "1",10}1112prod→ {'region': 'eu', 'workers': '4'} = {13    "region": "eu",14    "workers": "4",15}1617environment→ dev = "dev"  #@environment="prod"1819config→ {'debug': 'false', 'region': 'us', 'workers': '2'} = base{'debug': 'false', 'region': 'us', 'workers': '2'}.copy()20if environment == "dev":
  2. config ← {'debug': 'true', 'region': 'us', 'workers': '1'}

    19config = base.copy()20if environmentdev == "dev":21    config→ {'debug': 'true', 'region': 'us', 'workers': '1'}.update(dev{'debug': 'true', 'workers': '1'})22else:
  3. parts ← []

    25parts→ [] = []26for key in sorted(config):
  4. parts ← ['debug=true']

    pass 1 of 3
    25parts = []26for keydebug in sorted(config{'debug': 'true', 'region': 'us', 'workers': '1'}):27    parts→ ['debug=true'].append(keydebug + "=" + config[key]true)
    All 3 passes — pass 1 is the card above
    passkeyconfig[key]parts
    1debugtrue[] ['debug=true']
    2regionus['debug=true'] ['debug=true', 'region=us']
    3workers1['debug=true', 'region=us'] ['debug=true', 'region=us', 'workers=1']
  5. print("config=" + ";".join(parts))

    29print("config=" + ";".join(parts['debug=true', 'region=us', 'workers=1']))
    outputconfig=debug=true;region=us;workers=1
  1. base ← {'debug': 'false', 'region': 'us', 'workers': '2'}, dev ← {'debug': 'true', 'workers': '1'}

    1base→ {'debug': 'false', 'region': 'us', 'workers': '2'} = {2    "debug": "false",3    "region": "us",4    "workers": "2",5}67dev→ {'debug': 'true', 'workers': '1'} = {8    "debug": "true",9    "workers": "1",10}1112prod→ {'region': 'eu', 'workers': '4'} = {13    "region": "eu",14    "workers": "4",15}1617environment→ prod = "prod"1819config→ {'debug': 'false', 'region': 'us', 'workers': '2'} = base{'debug': 'false', 'region': 'us', 'workers': '2'}.copy()20if environment == "dev":
  2. config ← {'debug': 'false', 'region': 'eu', 'workers': '4'}

    20if environment == "dev":21    config.update(dev)22else:23    config→ {'debug': 'false', 'region': 'eu', 'workers': '4'}.update(prod{'region': 'eu', 'workers': '4'})
  3. parts ← []

    25parts→ [] = []26for key in sorted(config):
  4. parts ← ['debug=false']

    pass 1 of 3
    25parts = []26for keydebug in sorted(config{'debug': 'false', 'region': 'eu', 'workers': '4'}):27    parts→ ['debug=false'].append(keydebug + "=" + config[key]false)
    All 3 passes — pass 1 is the card above
    passkeyconfig[key]parts
    1debugfalse[] ['debug=false']
    2regioneu['debug=false'] ['debug=false', 'region=eu']
    3workers4['debug=false', 'region=eu'] ['debug=false', 'region=eu', 'workers=4']
  5. print("config=" + ";".join(parts))

    29print("config=" + ";".join(parts['debug=false', 'region=eu', 'workers=4']))
    outputconfig=debug=false;region=eu;workers=4