Starting a conversation here as suggested by Nikita in [unittest.mock] Autospecced decorator-transformed methods · Issue #100596 · python/cpython · GitHub
The issue is that autospeccing in unittest.mock doesn’t work as expected when given a function which has its signature transformed by a decorator. For example:
def acquire( func: Callable[Concatenate[Any, int, _P], Awaitable[_T]] ) -> Callable[Concatenate[Any, _P], Awaitable[_T]]: @functools.wraps(func) def wrapper(self, *args: _P.args, **kwargs: _P.kwargs) -> _T: return func(self, 0, *args, **kwargs) return wrapper class A: @acquire def test(self, foo: int) -> None: return a = A() a.test() # Works with patch("__main__.a", autospec=True): a.test() # TypeError: missing a required argument: 'foo'
I’m wondering if
functools.wraps() could be improved to modify the signature of the function, so autospec ends up working as the user expects.
Nikita suggested adding a new kw to specify the signature. But, if it’s possible to automatically infer the information from typing annotations, so it “just works”, that’d be even better.