Skip to content

Commit b8d0bfc

Browse files
authored
Do not type DeclarativeContainer.__getattr__ as returning a Provider (#973)
1 parent 634ccec commit b8d0bfc

2 files changed

Lines changed: 12 additions & 4 deletions

File tree

src/dependency_injector/containers.pyi

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class Container:
5757
def __init__(self) -> None: ...
5858
def __deepcopy__(self, memo: Optional[Dict[str, Any]]) -> _Self: ...
5959
def __setattr__(self, name: str, value: Union[Provider[Any], Any]) -> None: ...
60-
def __getattr__(self, name: str) -> Provider[Any]: ...
6160
def __delattr__(self, name: str) -> None: ...
6261
def set_providers(self, **providers: Provider[Any]) -> None: ...
6362
def set_provider(self, name: str, provider: Provider[Any]) -> None: ...
@@ -77,8 +76,12 @@ class Container:
7776
warn_unresolved: bool = False,
7877
) -> None: ...
7978
def unwire(self) -> None: ...
80-
def init_resources(self, resource_type: Type[BaseResource[Any]] = BaseResource) -> Optional[Awaitable[None]]: ...
81-
def shutdown_resources(self, resource_type: Type[BaseResource[Any]] = BaseResource) -> Optional[Awaitable[None]]: ...
79+
def init_resources(
80+
self, resource_type: Type[BaseResource[Any]] = BaseResource
81+
) -> Optional[Awaitable[None]]: ...
82+
def shutdown_resources(
83+
self, resource_type: Type[BaseResource[Any]] = BaseResource
84+
) -> Optional[Awaitable[None]]: ...
8285
def load_config(self) -> None: ...
8386
def apply_container_providers_overridings(self) -> None: ...
8487
def reset_singletons(self) -> SingletonResetContext[C_Base]: ...
@@ -104,7 +107,8 @@ class Container:
104107
@overload
105108
def traverse(cls, types: Optional[Iterable[Type[TT]]] = None) -> Iterator[TT]: ...
106109

107-
class DynamicContainer(Container): ...
110+
class DynamicContainer(Container):
111+
def __getattr__(self, name: str) -> Provider[Any]: ...
108112

109113
class DeclarativeContainer(Container):
110114
cls_providers: ClassVar[Dict[str, Provider[Any]]]

tests/typing/dynamic_container.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,7 @@
2929
# Test 6: to check base class
3030
# NOTE: Using assignment to check base class instead of exact type
3131
container6: containers.Container = containers.DynamicContainer()
32+
33+
# Test 7: dynamic attribute access resolves to a Provider (see issue #910)
34+
container7 = containers.DynamicContainer()
35+
assert_type(container7.some_provider, providers.Provider[Any])

0 commit comments

Comments
 (0)