Passing parameters to Resource provider
Closed this issue · 4 comments
It seems that passing parameters to resource is not working for subclasses of resources.Resource and resources.AsyncResource. If run
# poc_task.py
from dependency_injector import resources
class PocTask(resources.Resource):
def __init__(self):
print("poc task init")
def init(self):
print("poc task start")
def shutdown(self, some):
print("poc task finish")
# contianers.py
from dependency_injector import containers, providers
from tasks.poc_task import PocTask
class Container(containers.DeclarativeContainer):
config = providers.Configuration()
config.from_yaml(config_path, required=True)
poc_task = providers.Resource(PocTask)
# Other dependencieswhen PocTask is instantiated it calls the constructor and poc task init is printed. But if you try to add some additional arguments:
# poc_task.py
from dependency_injector import resources
class PocTask(resources.Resource):
def __init__(self, timeout: int):
print("poc task init")
def init(self):
print("poc task start")
def shutdown(self, some):
print("poc task finish")
# contianers.py
from dependency_injector import containers, providers
from tasks.poc_task import PocTask
class Container(containers.DeclarativeContainer):
config = providers.Configuration()
config.from_yaml(config_path, required=True)
poc_task = providers.Resource(PocTask, timeout=config.timeout.as_int())
# Other dependenciesit complains about calling PocTask constructor:
TypeError: PocTask.__init__() missing 1 required positional argument: 'timeout'
Is it not implemented on purpose, or am I missing something?
As a workaround I've applied trick suggested here:
poc_task = providers.Resource(lambda timeout: PocTask(timeout), timeout=config.timeout.as_int())args/kwargs are passed to the init() method:
class PocTask(resources.Resource):
def __init__(self):
print("poc task init")
def init(self, timeout: int):
print("poc task start", timeout)
def shutdown(self, some):
print("poc task finish")poc_task = providers.Resource(lambda timeout: PocTask(timeout), timeout=config.timeout.as_int())
BTW, with this approach Resource stop working as a resource (i.e. no init/shutdown are called)
args/kwargsare passed to theinit()method:class PocTask(resources.Resource):
def __init__(self): print("poc task init") def init(self, timeout: int): print("poc task start", timeout) def shutdown(self, some): print("poc task finish")
Thank you!