Description
In the following code, Pyright emits a reportInvalidTypeArguments
warning on the parameter annotation service: Annotated[FooService, Depends(Provide[Container.foo_service])]
:
from typing import Annotated, Any
from dependency_injector import containers, providers
from dependency_injector.wiring import Provide, inject
from fastapi import APIRouter, Depends
from fastapi.responses import JSONResponse
class IFooService:
def __call__(self) -> str: ...
class FooService:
def __call__(self) -> str:
return "foo"
class Container(containers.DeclarativeContainer):
wiring_config = containers.WiringConfiguration(modules=["."])
env_config = providers.Configuration()
foo_service = providers.Factory(FooService)
router = APIRouter()
@router.post("/v1/foo", response_model=JSONResponse)
@inject
def detect(
request: Any,
service: Annotated[FooService, Depends(Provide[Container.foo_service])],
) -> JSONResponse:
foo = service()
return JSONResponse(content={"foo": foo})
This warning is caused by a change in the definition of Provide
in version 4.47.0. The correct definitions should look like this:
class _Marker(Generic[T]):
__IS_MARKER__ = True
def __init__(
self,
provider: Union[providers.Provider, Container, str],
modifier: Optional[Modifier] = None,
) -> None:
if _is_declarative_container(provider):
provider = provider.__self__
self.provider = provider
self.modifier = modifier
def __class_getitem__(cls, item) -> T:
if isinstance(item, tuple):
return cls(*item)
return cls(item)
def __call__(self) -> T:
return self
class Provide(_Marker[T]): ...
class Provider(_Marker[T]): ...
class Closing(_Marker[T]): ...
Metadata
Metadata
Assignees
Labels
No labels