webhooks: Update comment about typing the webhook decorator.

The previous link was to "extended callable" types, which are
deprecated in favor of callback protocols.  Unfortunately, defining a
protocol class can't express the typing -- we need some sort of
variadic generics[1].  Specifically, we wish to support hitting the
endpoint with additional parameters; thus, this protocol is
insufficient:

```
class WebhookHandler(Protocol):
    def __call__(request: HttpRequest, api_key: str) -> HttpResponse: ...
```
...since it prohibits additional parameters.  And allowing extra
arguments:
```
class WebhookHandler(Protocol):
    def __call__(request: HttpRequest, api_key: str,
                 *args: object, **kwargs: object) -> HttpResponse: ...
```
...is similarly problematic, since the view handlers do not support
_arbitrary_ keyword arguments.

[1] https://github.com/python/typing/issues/193
This commit is contained in:
Alex Vandiver 2020-08-19 15:20:05 -07:00 committed by Tim Abbott
parent ea8823742b
commit 8cfacbf8aa
1 changed files with 3 additions and 2 deletions

View File

@ -324,8 +324,9 @@ def api_key_only_webhook_view(
webhook_client_name: str, webhook_client_name: str,
notify_bot_owner_on_invalid_json: bool=True, notify_bot_owner_on_invalid_json: bool=True,
) -> Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]]: ) -> Callable[[Callable[..., HttpResponse]], Callable[..., HttpResponse]]:
# TODO The typing here could be improved by using the Extended Callable types: # Unfortunately, callback protocols are insufficient for this:
# https://mypy.readthedocs.io/en/latest/kinds_of_types.html#extended-callable-types # https://mypy.readthedocs.io/en/stable/protocols.html#callback-protocols
# Variadic generics are necessary: https://github.com/python/typing/issues/193
def _wrapped_view_func(view_func: Callable[..., HttpResponse]) -> Callable[..., HttpResponse]: def _wrapped_view_func(view_func: Callable[..., HttpResponse]) -> Callable[..., HttpResponse]:
@csrf_exempt @csrf_exempt
@has_request_variables @has_request_variables