Container providers traversalΒΆ

To traverse container providers use method .traverse().

from dependency_injector import containers, providers


def init_database():
    return ...


def init_cache():
    return ...


class Service:
    def __init__(self, database, cache):
        self.database = database
        self.cache = cache


class Container(containers.DeclarativeContainer):

    config = providers.Configuration()

    service = providers.Factory(
        Service,
        database=providers.Resource(
            init_database,
            url=config.database_url,
        ),
        cache=providers.Resource(
            init_cache,
            hosts=config.cache_hosts,
        ),
    )


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

    for provider in container.traverse():
        print(provider)

    # <dependency_injector.providers.Configuration('config') at 0x10d37d200>
    # <dependency_injector.providers.Factory(<class '__main__.Service'>) at 0x10d3a2820>
    # <dependency_injector.providers.Resource(<function init_database at 0x10bd2cb80>) at 0x10d346b40>
    # <dependency_injector.providers.ConfigurationOption('config.cache_hosts') at 0x10d37d350>
    # <dependency_injector.providers.Resource(<function init_cache at 0x10be373a0>) at 0x10d346bc0>
    # <dependency_injector.providers.ConfigurationOption('config.database_url') at 0x10d37d2e0>

Method .traverse() returns a generator. Traversal generator visits all container providers. This includes nested providers even if they are not present on the root level of the container.

Traversal generator guarantees that each container provider will be visited only once. It can traverse cyclic provider graphs.

Traversal generator does not guarantee traversal order.

You can use types=[...] argument to filter providers. Traversal generator will only return providers matching specified types.

container = Container()

for provider in container.traverse(types=[providers.Resource]):
    print(provider)

 # <dependency_injector.providers.Resource(<function init_database at 0x10bd2cb80>) at 0x10d346b40>
 # <dependency_injector.providers.Resource(<function init_cache at 0x10be373a0>) at 0x10d346bc0>