8000 Pyright raises errors for Annotated type in 4.47.0. · Issue #892 · ets-labs/python-dependency-injector · GitHub
[go: up one dir, main page]

Skip to content
Pyright raises errors for Annotated type in 4.47.0. #892
@S-aiueo32

Description

@S-aiueo32

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

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0