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).