classification
Title: typing.get_type_hints not working with forward-declaration and decorated functions
Type: behavior Stage:
Components: Library (Lib) Versions: Python 3.7, Python 3.6
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: gvanrossum, levkivskyi, netbnd
Priority: normal Keywords: newcomer friendly

Created on 2019-08-13 10:42 by netbnd, last changed 2019-08-14 10:40 by levkivskyi.

Files
File name Uploaded Description Edit
typing_check_wrapped.zip netbnd, 2019-08-13 10:42 Sample code with working and non working cases is attached to reproduce the issue.
Messages (5)
msg349542 - (view) Author: Netzeband (netbnd) Date: 2019-08-13 10:42
When decorating a function and using a forward declaration as type hint, the typing.get_type_hints function does not work anymore, since it cannot find the forward declared name in the namespace. After debugging I think, the typing.get_type_hints function is actually using the namespace of the decorator instead of the decorated function.

When using a normal class type (no forward declaration) everything works fine and also when not using any decorator it works like expected.

As a workaround, one could pass the local namespace to typing.get_type_hints. However in normal usecases this function is used for runtime typechecking in a deep call hierarchy. So one would normally not have access to the right local namespace, only to the function object itself. 

However there is another easy workaround. At least when using the functool.wraps method to create a function decorator. The decorated functions has a "__wrapped__" attribute, which references the original function. When using "typing.get_type_hints(function.__wrapped__)" instead of "typing.get_type_hints(function)", it works like expected. So maybe this could be built in into the get_type_hints method.
msg349565 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2019-08-13 14:38
Using `__wrapped__` if present sounds like a good idea. Ivan, what do you think?

Netzeband, have you considered submitting a PR with the necessary changes (and tests and docs)?
msg349580 - (view) Author: Ivan Levkivskyi (levkivskyi) * (Python committer) Date: 2019-08-13 16:22
> Using `__wrapped__` if present sounds like a good idea.

Yeah, I like this idea, this will likely cover most use cases (since most people actually do use @wraps).
msg349581 - (view) Author: Guido van Rossum (gvanrossum) * (Python committer) Date: 2019-08-13 16:28
Maybe we should tag this issue "newcomer friendly"? It seems a pretty open
and shut case.
msg349594 - (view) Author: Netzeband (netbnd) Date: 2019-08-13 17:57
Thanks for your feedback. I can create a pull-request. However, I did it never before for the Python-Lib, so I first have to setup the correct environment for that and ensure, that I can run all test-cases.

Since I'm on vacation soon, it could take several weeks. If someone wants to solve the issue earlier, please don't hesitate. 

I will write it in this issue ticket, as soon as I finished the PR.
History
Date User Action Args
2019-08-14 10:40:10levkivskyisetkeywords: + newcomer friendly
2019-08-13 17:57:17netbndsetmessages: + msg349594
2019-08-13 16:28:22gvanrossumsetmessages: + msg349581
2019-08-13 16:22:23levkivskyisetmessages: + msg349580
2019-08-13 14:38:28gvanrossumsetmessages: + msg349565
2019-08-13 10:58:08xtreaksetnosy: + gvanrossum, levkivskyi
2019-08-13 10:42:59netbndcreate