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>