Data Validation Patterns
Defaults Merge
Validation often applies default values before code reads configuration fields.
defaults
Merging defaults with overrides gives every expected configuration key a value.
Defaults Merge
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']}")
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})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}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
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})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}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