typeddjango / djangorestframework-stubs

PEP-484 stubs for django-rest-framework
MIT License
454 stars 118 forks source link

`as_view()` is not compatible with the view argument of `path` #514

Open albertjan opened 1 year ago

albertjan commented 1 year ago

Bug report

What's wrong

For this line:

path("auth-test/", apitest.AuthTest.as_view()),

we get the following type error:

..../urls.py:70:9 - error: Argument of type "AsView[GenericView]" cannot be assigned to parameter "view" of type "Sequence[URLResolver | str]" in function "path"
    "AsView[GenericView]" is incompatible with "Sequence[URLResolver | str]" (reportGeneralTypeIssues)

How is that should be

Since it works the types should also be compatible right?!

System information

intgr commented 1 year ago

First, note that pyright is not officially supported by TypedDjango project although we're open to improvements that help other type checkers.

Note that path() is an overloaded function with multiple signatures: https://github.com/typeddjango/django-stubs/blob/82c394fbdc1461d0d483162577fac50e9cacd605/django-stubs/urls/conf.pyi#L18-L28 It's weird that pyright singles out one of the multiple signatures in its error message.

The first signature with view: Callable[..., HttpResponseBase] should match AsView[GenericView], because AsView.__call__ is defined as the _View typevar, which in this case is GenericView.

And GenericView's __call__ signature def __call__(self, request: HttpRequest, *args: Any, **kwargs: Any) -> Response should be compatible with the callable.

This works in my projects with mypy. If you figure out why pyright doesn't agree with this chain of reasoning, we might be able to come up with a fix or work-around.

albertjan commented 12 months ago

Thanks! I'll investigate a little more. 😊

j-osephlong commented 10 months ago

This has been my main issue in adopting drf stubs, this getting fixed would be great 😊