Issue 42921: Inferred Optional type of wrapper function arguments (original) (raw)

typing.get_type_hints gives a different result for a wrapper created with functools.wraps in case of inferred Optional arguments (when the default value of the argument is None)

from functools import wraps
from typing import get_type_hints

def foo(bar: int = None): ...

@wraps(foo)
def foo2(*args, **kwargs): ...

print(get_type_hints(foo))  # {'bar': typing.Optional[int]}
print(get_type_hints(foo2))  # {'bar': <class 'int'>}

This is because get_type_hints use the defauts of the wrapper (foo2) and not those of the wrapped function (foo). This is not consistent with some other tools like inspect.signature which gives the same signature (and thus same default argument) for the wrapped function and its wrapper.

I think this case has simply been forgotten in the resolution of https://bugs.python.org/issue37838 (fixing get_type_hints not taking wraps in account at all), because inferred Optional is a kind deprecated feature (https://github.com/python/typing/issues/275).