hug icon indicating copy to clipboard operation
hug copied to clipboard

TypeError if I use typing generics for output - disable on_invalid globally?

Open sanzoghenzo opened this issue 3 years ago • 0 comments

This is related to #507

I would like to use typing annotations the "normal way", that is to describe the actual return type of a function and not use it as a transformer.

Also, I think that on_invalid should not use the return type from typing annotations by default. That is the problem I encounter with the following code:

from typing import Dict, Any

import hug


@hug.post("/sample")
def sample_task(text: str, return_empty: bool) -> Dict[str, Any]:
    return {} if return_empty else {"result": text}


api = hug.API(__name__)


if __name__ == '__main__':
    response = hug.test.post(api, "/sample")
    assert response.status == hug.HTTP_400

The error message is forced into a transformation to Dict[str, Any] that fails:

Traceback (most recent call last):
  File "C:/Users/sanzo/source/repos/dp-api/src/test_multiple_modules/main.py", line 15, in <module>
    response = hug.test.post(api, "/sample")
  File "C:\Users\sanzo\AppData\Local\pypoetry\Cache\virtualenvs\dp-api-l3tZMAdC-py3.7\lib\site-packages\hug\test.py", line 91, in call
    response,
  File "C:\Users\sanzo\AppData\Local\pypoetry\Cache\virtualenvs\dp-api-l3tZMAdC-py3.7\lib\site-packages\falcon\api.py", line 269, in __call__
    responder(req, resp, **params)
  File "C:\Users\sanzo\AppData\Local\pypoetry\Cache\virtualenvs\dp-api-l3tZMAdC-py3.7\lib\site-packages\hug\interface.py", line 947, in __call__
    raise exception
  File "C:\Users\sanzo\AppData\Local\pypoetry\Cache\virtualenvs\dp-api-l3tZMAdC-py3.7\lib\site-packages\hug\interface.py", line 915, in __call__
    return self.render_errors(errors, request, response)
  File "C:\Users\sanzo\AppData\Local\pypoetry\Cache\virtualenvs\dp-api-l3tZMAdC-py3.7\lib\site-packages\hug\interface.py", line 819, in render_errors
    data, **self._arguments(self._params_for_on_invalid, request, response)
  File "c:\tools\miniconda3\lib\typing.py", line 668, in __call__
    raise TypeError(f"Type {self._name} cannot be instantiated; "
TypeError: Type Dict cannot be instantiated; use dict() instead

Things get worse if I want to return None and specify Union[None, Dict[str, Any]] as return type.

Using dict works, but then mypy complains about it:

error: Implicit generic "Any". Use "typing.Dict" and specify generic parameters  [type-arg]

If this is a feature and not a bug, is there a way to globally set on_invalid to None?

sanzoghenzo avatar Jul 17 '20 09:07 sanzoghenzo