Dataclass-based configuration system with strict validation and auto-finalization.
Project description
pydrafig
A dataclass-based configuration system with strict validation, automatic finalization, and enhanced CLI parsing. It is heavily inspired by pydra.
Features
- Dataclass with perks:
@pydraclassis a wrapper around standard Python@dataclass, adding extra functionality while preserving standard behavior. - Strict attribute validation: Catches typos with helpful error messages
- Recursive finalization: Automatically finalizes all nested configs (including those in lists/dicts/tuples)
- Enhanced CLI parsing: Full Python expression support (including
numpy,torch, etc.) - Serialization: Export to dict/YAML/pickle/dill
- Type hints: Full IDE support with autocomplete
Quick Start
Basic Config
from pydrafig import pydraclass
from dataclasses import field
@pydraclass
class TrainConfig:
learning_rate: float = 0.001
batch_size: int = 32
epochs: int = 10
config = TrainConfig()
config.learning_rate = 0.01 # ✅ Valid
config.learning_rat = 0.01 # ❌ Raises InvalidConfigurationError with suggestion
Nested Configs
@pydraclass
class OptimizerConfig:
name: str = "adam"
lr: float = 0.001
@pydraclass
class ModelConfig:
hidden_size: int = 128
optimizer: OptimizerConfig = field(default_factory=OptimizerConfig)
config = ModelConfig()
config.optimizer.lr = 0.01
Important: Use field(default_factory=ConfigClass) for nested configs to avoid shared instances!
Finalization
Configs support a finalize() hook for custom validation:
@pydraclass
class Config:
batch_size: int = 32
max_batch_size: int = 128
def finalize(self):
if self.batch_size > self.max_batch_size:
raise ValueError("batch_size exceeds max_batch_size")
config = Config()
config.batch_size = 256
config._finalize() # Raises ValueError
The _finalize() method automatically:
- Recursively finalizes all nested configs (even in lists/dicts/tuples)
- Calls your custom
finalize()hook - Marks the config as finalized
CLI Usage
from pydrafig import main
@pydraclass
class TrainConfig:
learning_rate: float = 0.001
batch_size: int = 32
@main(TrainConfig)
def train(config: TrainConfig):
print(f"Training with lr={config.learning_rate}, batch_size={config.batch_size}")
if __name__ == "__main__":
train() # Automatically parses CLI args
Run with:
# Use defaults
python train.py
# Override single values
python train.py learning_rate=0.01 batch_size=64
# Use complex Python literals (lists, dicts, tuples, etc.)
python train.py 'layers=[64,128,256]' 'params={"dropout":0.1}'
# Show config without running
python train.py --show learning_rate=0.01
# Nested configs
python train.py optimizer.lr=0.01 optimizer.weight_decay=1e-4
CLI Expression Evaluation
The CLI parser supports full Python expression evaluation using exec():
# Basic values work directly
python train.py learning_rate=0.01
# Complex expressions are evaluated
python train.py 'layers=[64, 128, 256]' \
'params={"dropout": 0.1}' \
'hidden_size=2**8' \
'threshold=math.sqrt(2)'
The execution environment includes standard Python types (list, dict, int, float, etc.) and common math libraries (math, numpy (as np), torch) if installed.
Note: Because this uses
exec(), only run configs from trusted sources.
API Reference
@pydraclass
Decorator that creates a strict, auto-finalizing config class.
@pydraclass
class MyConfig:
param: type = default_value
ConfigMeta Methods
All @pydraclass decorated classes have these methods:
_finalize(): Recursively finalize all nested configs, then callfinalize()finalize(): User-defined hook for custom validation (override this)to_dict(): Convert config to dictionarysave_yaml(path): Save config to YAML filesave_pickle(path): Save config to pickle filesave_dill(path): Save config to dill file
CLI Functions
main(ConfigClass): Decorator for main functions that take a config argumentrun(fn): Run a function with config parsed from CLI (infers config type from annotation)apply_overrides(config, args): Manually apply CLI overrides to a config
Examples
See the examples/ directory for full usage examples.
Files
base_config.py- Core@pydraclassdecorator andConfigMetaclasscli.py- CLI parsing logic usingexec()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pydrafig-0.1.1.tar.gz.
File metadata
- Download URL: pydrafig-0.1.1.tar.gz
- Upload date:
- Size: 13.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e08d09fdbc7a7f5825f5d3abdcaaf2527f79bfbb172a7f509b388b2bee217d50
|
|
| MD5 |
14bc9324b50609f0fcfd923299de9548
|
|
| BLAKE2b-256 |
202b1cd1413aacba2e77c286cf638abff744264ac68d81b64bd8fa4d1472a804
|
File details
Details for the file pydrafig-0.1.1-py3-none-any.whl.
File metadata
- Download URL: pydrafig-0.1.1-py3-none-any.whl
- Upload date:
- Size: 11.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d1a84ad698bf5b6ab21917466abbfd43e5b04eb36d5d14bcf2f22c2811bda17
|
|
| MD5 |
df844852f19eb87a61192aa77286e4fb
|
|
| BLAKE2b-256 |
f6cd0f574f0a17d83d8d520e23c99d05fdd43aad7db9aa18c29b33189e94ad5e
|