Skip to content

Latest commit

 

History

History
73 lines (54 loc) · 1.56 KB

File metadata and controls

73 lines (54 loc) · 1.56 KB

specbuild

PyPI version

Registry-based object builder for nested configuration dictionaries.

Docs: https://karimknaebel.github.io/specbuild/

Install

pip install specbuild

Simple example

from specbuild import register, build

@register()
class Encoder:
    def __init__(self, channels: int):
        self.channels = channels

cfg = {"type": "Encoder", "channels": 64}
model = build(cfg)

Advanced example

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.