Skip to content

Short syntax for nested dict containers

When you only need a ConfigurationDict of a known child type, you can skip declaring an intermediate subclass.

Long form

from superconf import ConfigurationDict, ConfigurationObj, FieldConf, FieldString

class AppFeature(ConfigurationObj):
    name = FieldString()
    group = FieldString(default="__base__")

class AppFeatures(ConfigurationDict):
    class Meta:
        children_class = AppFeature

class App(ConfigurationObj):
    features = FieldConf(AppFeatures)

Short form

Pass ConfigurationDict to FieldConf and set children_class there:

from superconf import ConfigurationDict, ConfigurationObj, FieldConf, FieldString

class AppFeature(ConfigurationObj):
    class Meta:
        extra_fields = True

    name = FieldString(help="Feature name")
    group = FieldString(default="__base__", help="Default group")

class App(ConfigurationObj):
    features = FieldConf(
        ConfigurationDict,
        help="Feature map",
        children_class=AppFeature,
    )

app = App(value={
    "features": {
        "feat1": {"name": "feat1", "group": "group1"},
        "feat2": {"name": "feat2", "extra": True},
    }
})

assert app.features.feat1.group == "group1"
assert app.features.feat2.extra is True

Pitfall

extra_fields is a ConfigurationObj Meta option. Passing it as a FieldConf(ConfigurationDict, extra_fields=True) kwarg raises InvalidFieldOption. Put extra_fields on the child class instead.