Open
Description
I'm guessing I just don't know what I'm doing and you aren't supposed to declare a resource from a dependency, but it seems as though _check_instance_type
is failing erroneously.
> python demo.py
type(i): <class '__main__.Inheritor'>
isinstance(i, Interface): True
Traceback (most recent call last):
File "demo.py", line 105, in <module>
test_main()
File "demo.py", line 101, in test_main
d.init_resources()
File "src/dependency_injector/containers.pyx", line 343, in dependency_injector.containers.DynamicContainer.init_resources
File "src/dependency_injector/providers.pyx", line 3691, in dependency_injector.providers.Resource.init
File "src/dependency_injector/providers.pyx", line 224, in dependency_injector.providers.Provider.__call__
File "src/dependency_injector/providers.pyx", line 3799, in dependency_injector.providers.Resource._provide
File "src/dependency_injector/providers.pxd", line 607, in dependency_injector.providers.__call
File "src/dependency_injector/providers.pyx", line 838, in dependency_injector.providers.Dependency.__call__
File "src/dependency_injector/providers.pyx", line 954, in dependency_injector.providers.Dependency._check_instance_type
dependency_injector.errors.Error: <class '__main__.Inheritor'> is not an instance of <class '__main__.Interface'>
import abc
from dependency_injector import providers, containers, resources
class Interface(metaclass=abc.ABCMeta):
@abc.abstractmethod
def init(self, *args, **kwargs):
pass
@abc.abstractmethod
def shutdown(self, *args, **kwargs):
pass
class Inheritor(resources.Resource, Interface):
def init(self, *args, **kwargs) -> None:
return None
def shutdown(self, *args, **kwargs):
...
class DemoContainer(containers.DeclarativeContainer):
inheritor = providers.Dependency(instance_of=Interface, default=Inheritor)
inheritor_instance = providers.Resource(inheritor)
def test_main():
i = Inheritor()
print(f"type(i): {type(i)}")
print(f"isinstance(i, Interface): {isinstance(i, Interface)}")
d = DemoContainer()
d.init_resources()
if __name__ == '__main__':
test_main()
Metadata
Metadata
Assignees
Labels
No labels