Selector provider

Selector provider selects provider based on a configuration value or another callable.

from dependency_injector import containers, providers


class SomeClass:
    ...


class SomeOtherClass:
    ...


class Container(containers.DeclarativeContainer):

    config = providers.Configuration()

    selector = providers.Selector(
        config.one_or_another,
        one=providers.Factory(SomeClass),
        another=providers.Factory(SomeOtherClass),
    )


if __name__ == "__main__":
    container = Container()

    container.config.override({"one_or_another": "one"})
    instance_1 = container.selector()
    assert isinstance(instance_1, SomeClass)

    container.config.override({"one_or_another": "another"})
    instance_2 = container.selector()
    assert isinstance(instance_2, SomeOtherClass)

The first argument of the Selector provider is called selector. It can be an option of a Configuration provider or any other callable. The selector callable has to return a string value. This value is used as a key for selecting the provider.

The providers are provided as keyword arguments. Argument name is used as a key for selecting the provider.

When a Selector provider is called, it gets a selector value and delegates the work to the provider with a matching name. The selector callable works as a switch: when the returned value is changed the Selector provider will delegate the work to another provider.

See also

Aggregate provider to inject a group of providers.