Skip to content

instanceof appears to fail when initializing resources based on a dependency #604

Open
@random-things

Description

@random-things

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions