Согласно справочнику :
Автоматическое определение создает фиктивные объекты, которые имеют те же атрибуты и методы, что и объекты, которые они заменяют, а любые функции и методы (включая конструкторы) имеют ту же сигнатуру вызова, что и реальный объект.
Но это не похоже на правду. Stdlib inspect
по-прежнему видит общую *args, **kwargs
подпись на макете:
>>> from unittest.mock import patch
>>> def foo(arg1, arg2, arg3):
... pass
...
>>> print(*inspect.signature(foo).parameters)
arg1 arg2 arg3
>>> with patch("__main__.foo", autospec=True) as mock:
... print(*inspect.signature(mock).parameters)
...
args kwargs
Автоспек работает , работает , в этом случае mock(1,2,3,4)
будет корректно повышать TypeError: too many positional arguments
, но, похоже, это реализовано с помощью некоторого кода глубже в стеке вызовов. Это не делается с помощью подписи вызова.
В коде, где вы на самом деле полагаетесь на саму подпись (и нуждаетесь в правильной подписи, сохраняемой при проверке в тестах), как автоматически задать макет таким образом, чтобы правильно сохранить подпись?