python-dependency-injector icon indicating copy to clipboard operation
python-dependency-injector copied to clipboard

instanceof appears to fail when initializing resources based on a dependency

Open random-things opened this issue 3 years ago • 0 comments
trafficstars

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()

random-things avatar Jul 08 '22 20:07 random-things