Precedence Order
Values are loaded in order. Later sources override earlier ones.
The Order
settings, metadata = load_settings(Config)
- Model defaults - Field defaults in your Pydantic model
- Global config -
~/.config/config/config.tomland~/.config/config/config.yaml - Project config -
./config.toml,./config.yaml, and files under./config/ .envfile -DATABASE_URL=...in./.env- Environment variables -
export DATABASE_URL=... - Runtime overrides -
overrides={"database_url": "..."}
Example
from pydantic import BaseModel
from utilityhub_config import load_settings
class Config(BaseModel):
workers: int = 4 # 1. Default
# 2. ~/.config/config/config.toml contains: workers = 6
# 3. ./config.yaml contains: workers: 8
# 4. .env contains: WORKERS=10
# 5. Environment has: export WORKERS=12
settings, _ = load_settings(Config)
print(settings.workers) # 12 (environment wins)
# 6. Runtime override wins over everything
settings, _ = load_settings(Config, overrides={"workers": 16})
print(settings.workers) # 16
Skip Auto-Discovery
Use config_file to load only a specific file:
from pathlib import Path
settings, _ = load_settings(
Config,
config_file=Path("./production.yaml")
)
# Only loads: defaults → production.yaml → .env → env → overrides
# Skips: global config, project auto-discovery