Validation often applies default values before code reads configuration fields.

defaults Merging defaults with overrides gives every expected configuration key a value.

Defaults Merge

timeout
defaults.py
Replay: real traced execution (multi-file project)
def with_defaults(defaults, overrides):
    merged = {**defaults, **overrides}
    return merged


timeout = 30
defaults = {"timeout": 10, "retries": 2}
overrides = {"timeout": timeout}
config = with_defaults(defaults, overrides)

print(f"timeout={config['timeout']};retries={config['retries']}")
def with_defaults(defaults, overrides):
    merged = {**defaults, **overrides}
    return merged


timeout = 60
defaults = {"timeout": 10, "retries": 2}
overrides = {"timeout": timeout}
config = with_defaults(defaults, overrides)

print(f"timeout={config['timeout']};retries={config['retries']}")
  1. timeout ← 30, defaults ← {'timeout': 10, 'retries': 2}, overrides ← {'timeout': 30}

    6timeout→ 30 = 30  #@timeout=607defaults→ {'timeout': 10, 'retries': 2} = {"timeout": 10, "retries": 2}8overrides→ {'timeout': 30} = {"timeout": timeout30}9config = with_defaults(defaults{'timeout': 10, 'retries': 2}, overrides{'timeout': 30})
  2. merged ← {'timeout': 30, 'retries': 2}

    1def with_defaults(defaults{'timeout': 10, 'retries': 2}, overrides{'timeout': 30}):2    merged→ {'timeout': 30, 'retries': 2} = {**defaults{'timeout': 10, 'retries': 2}, **overrides{'timeout': 30}}3    return merged{'timeout': 30, 'retries': 2}
  3. config ← {'timeout': 30, 'retries': 2}

    8overrides = {"timeout": timeout}9config→ {'timeout': 30, 'retries': 2} = with_defaults(defaults{'timeout': 10, 'retries': 2}, overrides{'timeout': 30})1011print(f"timeout={config['timeout']30};retries={config['retries']2}")
    outputtimeout=30;retries=2
  1. timeout ← 60, defaults ← {'timeout': 10, 'retries': 2}, overrides ← {'timeout': 60}

    6timeout→ 60 = 607defaults→ {'timeout': 10, 'retries': 2} = {"timeout": 10, "retries": 2}8overrides→ {'timeout': 60} = {"timeout": timeout60}9config = with_defaults(defaults{'timeout': 10, 'retries': 2}, overrides{'timeout': 60})
  2. merged ← {'timeout': 60, 'retries': 2}

    1def with_defaults(defaults{'timeout': 10, 'retries': 2}, overrides{'timeout': 60}):2    merged→ {'timeout': 60, 'retries': 2} = {**defaults{'timeout': 10, 'retries': 2}, **overrides{'timeout': 60}}3    return merged{'timeout': 60, 'retries': 2}
  3. config ← {'timeout': 60, 'retries': 2}

    8overrides = {"timeout": timeout}9config→ {'timeout': 60, 'retries': 2} = with_defaults(defaults{'timeout': 10, 'retries': 2}, overrides{'timeout': 60})1011print(f"timeout={config['timeout']60};retries={config['retries']2}")
    outputtimeout=60;retries=2