Registry-based object builder for nested configuration dictionaries.
Docs: https://karimknaebel.github.io/specbuild/
pip install specbuildfrom specbuild import register, build
@register()
class Encoder:
def __init__(self, channels: int):
self.channels = channels
cfg = {"type": "Encoder", "channels": 64}
model = build(cfg)This combines recursive builds, dotted import paths, partials, and a custom registry.
from specbuild import Registry, build, register
@register()
class Encoder:
def __init__(self, channels: int):
self.channels = channels
@register()
class Model:
def __init__(self, encoder, output_dir):
self.encoder = encoder
self.output_dir = output_dir
@register()
def scaled_add(x, y, scale):
return (x + y) * scale
optimizers = Registry()
@optimizers.register()
class ToyOptim:
def __init__(self, params, lr):
self.params = params
self.lr = lr
model = build(
{
"type": "Model",
"encoder": {"type": "Encoder", "channels": 64},
"output_dir": {"type": "pathlib.Path", "*": ["runs/exp1"]},
}
)
score = build({"type": "partial:scaled_add", "scale": 0.5})(3, 5)
optimizer = build(
{"type": "ToyOptim", "params": ["encoder.weight"], "lr": 3e-4},
registry=optimizers,
)Works well with cfgx for loading config dictionaries.